为什么对象的constructor
字段没有构造签名?
class X {
}
const x = new X
// disallowed:
// const y = new x.constructor
// cast to any just to see runtime behaviour:
const z = new (x.constructor as any)
console.log(z)
毫无疑问,有一个非常好的类型相关的原因,但我看不出它是什么。
答案 0 :(得分:1)
这是因为所有Object
的{{3}}都是Function
:
interface Object {
/** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
constructor: Function;
...
}
所以你必须施展它,但是你可以把它投射到比any
更有意义的东西:
type XConstructor = {
new (): X;
}
const z = new (x.constructor as XConstructor)
答案 1 :(得分:1)
现有GitHub issue有关此事;你可以在那里阅读讨论,说明为什么还没有完成。它的要点似乎是它使typing subclasses difficult,因为子类的构造函数不必是基类构造函数的子类型。
如果你不关心子类并且你可以控制类声明(或合并到它中),你可以在每个类的基础上自己做:
class X {
['constructor']: typeof X;
}
const x = new X;
const z = new x.constructor() // okay now
或者只是按照@ NitzanTomer的回答中提到的那样进行投射。
祝你好运!