为什么object.constructor是TypeScript中的“Function”而不是“newable”?

时间:2016-03-21 17:42:08

标签: types constructor typescript

在TypeScript中,我通常使用以下函数定义类类型:

declare type Type = { 
    new (...args: any[]): any
}

例如,当一个类作为参数传递时,可以使用它。这类似于C#中的Type,但也可以使用new运算符直接实例化。 AFAIK,这种类型定义实际上类似于:

  

可以接收任何数量和类型的参数的构造函数,并且可以返回任何内容。

如果一个参数,属性或其他变量应该包含对类的引用(更准确地说,包含它的构造函数),Type类型总是在手边,对我来说非常有用。

然而,有时候我遇到的情况是我没有引用类(构造函数)本身,只有它的原型。但是,仍然可以通过

获得对类本身的引用
obj.constructor

但是,类型为Function,并且无法实例化为类:

new obj.constructor(); // Error: Cannot use 'new' ...

这会产生错误:

  

不能对类型缺少调用或构造签名的表达式使用“new”。

如果我使用类型断言,编译器接受new运算符,并且编译后的代码在运行时按预期运行。

是否有一些我遗漏的内容可以解释为什么obj.constructor不具备现成的新功能?

1 个答案:

答案 0 :(得分:2)

因为TypeScript目前没有constructor属性的特殊处理。它是defined in lib.d.ts for the Object interface,所以它一般只能定义为一个函数。

https://github.com/Microsoft/TypeScript/issues/3841https://github.com/Microsoft/TypeScript/issues/4356是相关问题。

你可以这样做:

class Foo {
    constructor(public x: string) { }
}
var foo = new Foo("foo");

var bar = new (foo.constructor as { new(x: string): typeof foo })("bar");

允许你在foo的类型上是通用的(即你不需要在类型断言中明确地写Foo),但是你仍然需要明确地编写参数或者cop与...args: any[]合作。