是否可以使InstanceType <t>在抽象类上工作?

时间:2019-01-20 22:35:52

标签: typescript

我显然希望允许它引用实现而不是抽象本身,而仍然仅依赖抽象接口定义。

1 个答案:

答案 0 :(得分:2)

您可以使用prototype的类型而不是构造函数return的类型。

type AbstractInstanceType<T> = T extends { prototype: infer U } ? 
    U : never


abstract class Foo{
    foo:number
}

declare var foo: AbstractInstanceType<typeof Foo>;
foo.foo //ok

在使用typeof AbstractClass的情况下,最好使用构造函数签名。 InstanceType将适用于此:new (... a:any[]) => AbstractClass

如果您想在抽象类上创建静态工厂方法,那么将起作用:

abstract class Foo{
    foo: number
    static create<T extends Foo>(this: new () => T) {
        return new this();
    }

    static createWithArgs<T extends Foo, A extends any[]>(this: new (...a: A) => T, ...a: A) {
        return new this(...a);
    }
}
class Bar extends Foo { }
class Baz extends Foo {
    constructor(public n: string) {
        super();
    }
}

Bar.create()
Baz.createWithArgs("")