“类型构造函数<t> =函数&{原型:T}”如何应用于TypeScript中的抽象构造函数类型?

时间:2018-09-15 23:41:12

标签: typescript constructor abstract-class

关于TypeScript中的Abstract构造函数类型的问答,这是我想知道的答案:

Abstract constructor type in TypeScript

不幸的是,被接受的答案仅仅是一个无法解释的单行代码:type Constructor<T> = Function & { prototype: T }

看来,这个答案对提问者来说已经足够了,它是公认的答案,但是我无法理解答案如何应用于问题。

我尝试在评论中提问,并且尝试在聊天中询问某人以解释答案,但无济于事。另外,我认识到,这与那个问题几乎没有什么不同,但这仍然是关于代码的独特问题。

如何使用Function & { prototype: T }类型来模拟已知构造函数类型的抽象类?

1 个答案:

答案 0 :(得分:4)

JavaScript中,所有函数都有一个称为unsigned的特殊属性。如果将函数用作构造函数(通过使用prototype进行调用),则构造的实例将以该函数作为其原型。这是ES2015之前的类在JavaScript中的工作方式:

new

ES2015引入了// ES5-flavored class function Foo() { } // a normal function Foo.prototype.prop = 0; // adding a property to Foo.prototype var f = new Foo(); // using Foo as a constructor f.prop; // the instance inherits the added property 语法,其语法在后台完全相同...因此构造函数对象仍具有class属性,可从中继承构造的实例。

prototype

TypeScript通过声明所有功能实现的// ES2015-flavored class class Foo { } // explicitly a class Foo.prototype.prop = 0; // adding a property to Foo.prototype const f = new Foo(); // using Foo as a constructor f.prop; // the instance inherits the added property 接口具有prototype property of type any来对此建模。此外,当使用Function语法时,构造函数仍被视为class,并且constructorFunction属性从prototype缩小为与构造的类实例相同的类型:

any

即使TypeScript中的// TypeScript code class Foo { prop!: number; // Foo has a prop } Foo.prototype; // inspects as type Foo Foo.prototype.prop = 0; // so this works const f = new Foo(); // inspects as type Foo f.prop; // inspects as type number 类也具有abstract属性,其类型与实例类型相同。因此,尽管您无法在抽象类构造函数上调用prototype,也无法将其与诸如new之类的可更新类型进行匹配,但是您仍然可以谈论其new() => any

prototype

所有这些都意味着在TypeScript中,可能抽象的类构造函数是// more TS code abstract class Bar { abstract prop: number; } Bar.prototype; // inspects as type Bar Bar.prototype.prop = 0; // so this works const b = new Bar(); // whoops can't do this though 的子类型(其子类型),其Function属性是该构造函数的实例类型。因此,您可以说

prototype

使用intersection运算符组合type PossiblyAbstractConstructor<T> = Function & {prototype: T}; 和“具有Function类型的prototype属性的对象” ...

或类似地

T

使用interface extension达到相同的效果...

您知道以下内容有效:

interface PossiblyAbstractConstructor<T> extends Function {
  prototype: T;
}

那应该解释原始问题的答案如何适用。希望能有所帮助。祝好运!