Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 是否可以获取InstanceType<;T>;使用抽象类?_Typescript - Fatal编程技术网

Typescript 是否可以获取InstanceType<;T>;使用抽象类?

Typescript 是否可以获取InstanceType<;T>;使用抽象类?,typescript,Typescript,我显然希望允许它引用实现而不是抽象本身,同时仍然只依赖抽象接口定义。您可以使用原型的类型,而不是构造函数返回的类型 type AbstractInstanceType<T> = T extends { prototype: infer U } ? U : never abstract class Foo{ foo:number } declare var foo: AbstractInstanceType<typeof Foo>; foo.foo

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

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

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


abstract class Foo{
    foo:number
}

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

伟大的答案!你知道如何使用工厂静态方法工作吗?这可以得到我想要的实例类型,它可以在我所有的方法上工作,但是当我想做新的This()时,我得到的是T extends typeof AbstractClass,它不喜欢我。我尝试添加一个带有
if(this===ModelResource)抛出新错误('cannotconstruction on abstract types')的类型保护在start@NathanielTucker编辑答案以添加静态工厂
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("")