是否可以让 InstanceType<T> 在抽象类上工作?

Nat*_*ker 4 typescript

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

Tit*_*mir 6

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

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


abstract class Foo{
    foo:number
}

declare var foo: AbstractInstanceType<typeof Foo>;
foo.foo //ok
Run Code Online (Sandbox Code Playgroud)

使用构造函数签名可能会更好,而您本来会使用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("")
Run Code Online (Sandbox Code Playgroud)