我有一个函数,使用通用接口创建一个类。实例的属性由该泛型的参数设置,就像这样:
const ClassFactory = <T>() => {
class MyClass {
constructor(data: T) {
for (const key in data) {
if (!data.hasOwnProperty(key)) { continue; }
(this as any)[key] = data[key];
}
}
// other methods can be here
}
return MyClass;
}
const GeneratedClass = ClassFactory<{ id: number }>();
const myInstance = new GeneratedClass({ id: 1 });
console.log((myInstance as any).id); // logs 1
这段代码可以正常运行,但是存在两个问题:
myInstance
的类型中没有 T 类型的属性- 我希望myInstance.id
是一个数字- 我必须在构造函数中将
this
强制转换为any
,才能根据给定的数据进行赋值
为了解决第一个问题,我尝试了一些其他帖子中看到的方法,包括 class MyClass implements T
,但它们都导致相同的错误:A class can only implement an object type or intersection of object types with statically known members.ts(2422)
。虽然我理解为什么会发生这种情况,但由于在定义类时已知 T
,因此有没有办法使其起作用呢?
如果我的数据在一个 public data: T
属性中,那么 myInstance.data.id
的类型就是正确的。所以我的问题是,是否可以省略 .data
部分来实现这一点呢?
提前感谢您的回复。
javascript
标签呢? - Noobreturn MyClass as { new(): T }
。 - Jonas Wilmsreturn MyClass as { new(data: T): T };
,它可以正常地运行上面的示例,但是如果类中有任何方法,则会失败。理想情况下,它只应该覆盖new
,而不是整个类。 - Jason Athanasoglou