【问题标题】:How to extend interface from annonymous class如何从匿名类扩展接口
【发布时间】:2019-01-06 08:17:01
【问题描述】:

假设我有匿名类:

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

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您不能在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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      • 2018-06-20
      • 2017-08-15
      相关资源
      最近更新 更多