首页 > 解决方案 > 如何从匿名类扩展接口

问题描述

假设我有匿名课程:

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%0A接口%20I%20extends%20typeof%20AnonymousClass%20%7B%0D%0A%0D%0A%7D

标签: typescript

解决方案


您不能在extendsorimplements子句中使用表达式,但可以创建类型别名并使用它。您甚至可以使用与匿名类相同的名称,const因为它们位于不同的空间(值空间与类型空间

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

游乐场链接


推荐阅读