我知道打字稿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>
也没有。还有另一种方法可以做我想要的吗?
答案 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'
}
}
答案 1 :(得分:0)
怎么样:
static createInstance<T>(resource): Promise<T>