【问题标题】:Why is object.constructor a "Function", and not "newable" in TypeScript?为什么 object.constructor 在 TypeScript 中是“函数”,而不是“新的”?
【发布时间】:2016-04-08 00:58:18
【问题描述】:

在 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 不是现成的新产品?

【问题讨论】:

  • 你能给出一个完整的代码示例吗?我试图重现你所拥有的,很明显为什么你不能从生成的 js 中调用 new obj.constructor()。 a 对象上没有 constructor 属性。 typescriptlang.org/…

标签: types constructor typescript


【解决方案1】:

因为 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),但您仍然需要显式编写参数或使用@987654328 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 2014-10-06
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    相关资源
    最近更新 更多