如何从匿名类扩展接口

时间:2018-07-30 06:09:53

标签: typescript

假设我有一个匿名班:

const AnonymousClass = class {}
let a: typeof AnonymousClass;

如何从中扩展接口? 编译器对此失败:

interface I extends typeof AnonymousClass {

}

游乐场链接:https://www.typescriptlang.org/play/#src=const%20AnonymousClass%20%3D%20class%20%7B%7D%0D%0A%0D%0Alet%20a%3A%20typeof%20AnonymousClass%3B%0D%0A%0D%0Ainterface%20I%20extends%20typeof%20AnonymousClass%20%7B%0D%0A%0D%0A%7D

1 个答案:

答案 0 :(得分:2)

您不能在extendsimplements子句中使用表达式,但可以创建类型别名并改用它。您甚至可以使用与匿名类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

Playground link

相关问题