Typescript:构造函数字段缺少构造签名

时间:2017-08-23 09:00:49

标签: typescript constructor

为什么对象的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)

毫无疑问,有一个非常好的类型相关的原因,但我看不出它是什么。

2 个答案:

答案 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的回答中提到的那样进行投射。

祝你好运!