【发布时间】:2019-01-06 08:17:01
【问题描述】:
假设我有匿名类:
const AnonymousClass = class {}
let a: typeof AnonymousClass;
如何从中扩展接口? 编译器对此失败:
interface I extends typeof AnonymousClass {
}
【问题讨论】:
标签: typescript
假设我有匿名类:
const AnonymousClass = class {}
let a: typeof AnonymousClass;
如何从中扩展接口? 编译器对此失败:
interface I extends typeof AnonymousClass {
}
【问题讨论】:
标签: typescript
您不能在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
【讨论】: