returnntype Promise <this>

时间:2017-01-26 05:01:04

标签: typescript types this

我知道打字稿supports return type this。这可能是我需要的,除了我有一个静态方法,它返回定义它的类的实例或它的子类。所以我试图使用:

class A {
    static createInstance(resource):Promise<this> //<---what can I put here??
    {
        //pseudo code: load a module, async
        return loadModule(resource.module).then(() => {
            //find Class from resource data, can return A, or B or any subclass
            var targetClass = resource.getType().getClass();
            //create instance of A or any subclass of A
            return new targetClass.prototype.constructor();
        }
    }
}
//module B.js which is loaded on demand:
class B extends A {
    //I dont want to have to overwrite the returntype of createInstance
    //in every subclass of A
}

Promise<this>不起作用。 Promise<typeof this>也没有。还有另一种方法可以做我想要的吗?

2 个答案:

答案 0 :(得分:2)

返回this时,必须返回当前实例 由于实例已存在,您不需要向其返回Promise

如果要将Promise返回到this的子类,则意味着您不是真的想要返回this,而是返回该类的子类的实例是this的,这不是这个特征的含义。

请考虑以下代码:

class A {
    x: number = 0;

    add(y: number): this {
        this.x += y;
        return this;
    }

    sub(y: number): this {
        this.x -= y;
        return new B() as this;
    }
}

class B extends A { }

let a1 = new A();
console.log(a1.add(3).add(5).x); // 8

let a2 = new A();
console.log(a2.add(3).sub(2).x); // 0

第二个console.log应该基于“构造”打印1而不是0,因为返回this始终返回当前实例

修改

目前无法做到这一点 有一个未解决的问题:Polymorphic "this" for static members,他们的例子就是你想要做的。

第二次编辑

必须返回当前实例,而不仅仅是“此类”的实例,这是一个简单的例子:

class A {
    fn1(): this {
        return this;
    }

    fn2(): this {
        return new A(); // Error: Type 'A' is not assignable to type 'this'
    }
}

code in playground

答案 1 :(得分:0)

怎么样:

static createInstance<T>(resource): Promise<T>