在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
不具备现成的新功能?
答案 0 :(得分:2)
因为TypeScript目前没有constructor
属性的特殊处理。它是defined in lib.d.ts for the Object interface,所以它一般只能定义为一个函数。
https://github.com/Microsoft/TypeScript/issues/3841和https://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[]
合作。