2017-08-23 56 views
0

为什么对象的constructor字段没有构造体签名?Typescript:构造函数字段缺少构造体签名

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) 

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

回答

1

这是因为所有Object S的constructor propertyFunction

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

有现有的GitHub issue关于此;你可以阅读那里的讨论为什么这还没有完成。它的主旨似乎是它使typing subclasses difficult,因为子类的构造函数不必是基类的构造函数的子类型。

如果你不关心的子类,你可以控制类的声明(或合并到它),你可以在每个阶级基础做自己:

class X { 
    ['constructor']: typeof X; 
}  
const x = new X; 
const z = new x.constructor() // okay now 

或只是做铸造正如@ NitzanTomer的回答中所提到的。

祝你好运!