关于TypeScript中的Abstract构造函数类型的问答,这是我想知道的答案:
Abstract constructor type in TypeScript
不幸的是,被接受的答案仅仅是一个无法解释的单行代码:type Constructor<T> = Function & { prototype: T }
看来,这个答案对提问者来说已经足够了,它是公认的答案,但是我无法理解答案如何应用于问题。
我尝试在评论中提问,并且尝试在聊天中询问某人以解释答案,但无济于事。另外,我认识到,这与那个问题几乎没有什么不同,但这仍然是关于代码的独特问题。
如何使用Function & { prototype: T }
类型来模拟已知构造函数类型的抽象类?
答案 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
,并且constructor的Function
属性从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;
}
那应该解释原始问题的答案如何适用。希望能有所帮助。祝好运!