假设我有一个匿名班:
const AnonymousClass = class {}
let a: typeof AnonymousClass;
如何从中扩展接口? 编译器对此失败:
interface I extends typeof AnonymousClass {
}
答案 0 :(得分:2)
您不能在extends
或implements
子句中使用表达式,但可以创建类型别名并改用它。您甚至可以使用与匿名类const
相同的名称,因为它们位于不同的空格(value space vs type space)
const AnonymousClass = class {
static staticField = 0;
instanceField = 0;
}
let a: typeof AnonymousClass;
type AnonymousClass = typeof AnonymousClass
interface I extends AnonymousClass {
}
let foo: I;
foo.instanceField // invalid
foo.staticField // valid
上面的代码扩展了类的静态接口,您可能想扩展类的实例接口,您可以使用额外的InstanceType
条件类型:
const AnonymousClass = class {
static staticField = 0;
instanceField = 0;
}
let a: typeof AnonymousClass;
type AnonymousClass = InstanceType<typeof AnonymousClass>
interface I extends AnonymousClass {
}
let foo: I;
foo.instanceField // valid
foo.staticField // invalid