为什么 object.constructor 是一个“函数”,而不是 TypeScript 中的“可更新”?

2024-01-30

在 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(使用前将#替换为@)

为什么 object.constructor 是一个“函数”,而不是 TypeScript 中的“可更新”? 的相关文章

随机推荐