在 TypeScript 中,我通常使用以下方式定义类类型的类型:
declare type Type = {
new (...args: any[]): any
}
例如,当类作为参数传递时可以使用它。这有点类似于Type
是用C#编写的,但也可以直接实例化new
操作员。 AFAIK,这种类型定义实际上类似于:
一个构造函数,可以接收任意数量和类型的参数,并且可以返回任何内容。
如果参数、属性或其他变量预期包含对类的引用(更准确地说,对其构造函数),则Type
打字总是在手边,对我来说非常有用。
然而,有时我会遇到这样的情况:我没有引用类(构造函数)本身,只有它的原型。但是,仍然可以通过以下方式获取对类本身的引用
obj.constructor
哪个是类型Function
但是,并且不可能实例化为类:
new obj.constructor(); // Error: Cannot use 'new' ...
这会产生错误:
不能将“new”与类型缺少调用或构造签名的表达式一起使用。
如果我使用类型断言,编译器会接受new
运算符,编译后的代码在运行时的行为符合预期。
有什么我遗漏的东西可以解释为什么吗obj.constructor
是不是现成的可以换新的?
因为 TypeScript 目前没有对constructor
财产。它是在 lib.d.ts 中定义了 Object 接口, https://github.com/Microsoft/TypeScript/blob/release-1.8/lib/lib.d.ts#L96所以它只能被笼统地定义为一个函数。
https://github.com/Microsoft/TypeScript/issues/3841 https://github.com/Microsoft/TypeScript/issues/3841 and https://github.com/Microsoft/TypeScript/issues/4356 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
在类型断言中),但您仍然需要显式地编写参数或使用...args: any[]
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)