代码
class A {
id: number;
name: string;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
static toA<T extends { id: number, name: string }>({ id, name }: T): A {
const newObject = new A(id, name);
return newObject;
}
}
说明
仅通过欺骗 TypeScript 是无法改变运行时结构的。 as 只是告诉 TypeScript “不要想太多,只要假设 b 为 A”,TypeScript 不会做任何事情(包括为您编写 B 到 A 转换器),除非假设该对象的类型在类型检查(编译)时是A。
所以,我们应该为它写一个显式的转换器。我们收到了包含必填字段的任何对象,然后使用这些字段创建一个新的 A 对象。
示例
class A {
id: number;
name: string;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
static toA<T extends { id: number, name: string }>({ id, name }: T): A {
const newObject = new A(id, name);
return newObject;
}
}
class B extends A {
test: number;
constructor(id: number, name: string, test: number) {
super(id, name);
this.test = test;
}
}
const b = new B(1, "hi", 2);
console.log(A.toA(b)); // A { id: 1, name: 'hi' }