我想创建一个名为createInstance
的函数,该函数接收实例a
并创建与c
类型相同的新实例a
。请注意,在createInstance
内部,我不知道a
的类型是什么,我只知道它是从A
类继承的。但是我希望c
的类型为B
,这是a
的实际类型。这是到目前为止我得到的:
class A {
constructor(public ref: string) {}
}
class B extends A {
}
const createInstance = (a: A): void => {
const t = a.constructor
const c = new t("c")
console.log(c)
console.log(c instanceof B)
}
const b = new B("b")
createInstance(b)
我已经在打字稿游戏场中尝试过了,并且可以正常工作,我得到true
为c instanceof B
。但是它在new t("c")
行中显示警告,内容为:“此表达式不可构造。类型'Function'没有构造签名。”
正确的方法是什么?谢谢
这实际上仍然是TypeScript中缺少的功能,因为T.constructor
不是T类型,而只是普通功能。您可以强制铸造它:
const t = a.constructor as { new(ref: string): A };
编辑:您可以使用ConstructorParameters
来输入构造函数(参数列表):
const t = a.constructor as { new(...args: ConstructorParameters<typeof A>): A };
请参阅TS资料库#4536和此similar question的相对问题