Types 为什么object.constructor是“a”;“函数”;,而不是",;“可更新”;打字稿?

Types 为什么object.constructor是“a”;“函数”;,而不是",;“可更新”;打字稿?,types,constructor,typescript,Types,Constructor,Typescript,在TypeScript中,我通常使用以下命令定义类类型的类型: declare type Type = { new (...args: any[]): any } 例如,当类作为参数传递时,可以使用此选项。这与C#中的Type类似,但也可以使用new操作符直接实例化。首先,该类型定义实际上类似于: 一种构造函数,可以接收任意数量和类型的参数,并且可以返回任何内容 如果参数、属性或其他变量预期包含对类的引用(更准确地说,是对其构造函数的引用),则类型总是在手边,对我来说非常有用 然而

在TypeScript中,我通常使用以下命令定义类类型的类型:

declare type Type = { 
    new (...args: any[]): any
}
例如,当类作为参数传递时,可以使用此选项。这与C#中的
Type
类似,但也可以使用
new
操作符直接实例化。首先,该类型定义实际上类似于:

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

如果参数、属性或其他变量预期包含对类的引用(更准确地说,是对其构造函数的引用),则
类型总是在手边,对我来说非常有用


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

obj.constructor
但是,其类型为
函数
,无法实例化为类:

new obj.constructor(); // Error: Cannot use 'new' ...
这将产生以下错误:

无法将“new”与类型缺少调用或构造签名的表达式一起使用

如果使用类型断言,编译器将接受
new
运算符,编译后的代码在运行时的行为与预期的一样


我是否缺少一些东西来解释为什么
obj.constructor
不能立即更新?

因为TypeScript目前没有对
constructor
属性的特殊处理。所以它只能一般地定义为一个函数

以及相关问题

您可以这样做:

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退出:可以给出任何[]

作为完整的代码示例吗?我试图重现您所拥有的,很明显,为什么您不能从生成的js调用新的obj.constructor()。对象上没有构造函数属性。