TypeScript:基类中的多态 return 类型?
TypeScript: polymorphic return types in a base class?
我有一个基础class(基础)和两个子classes A和B。
Base 有一个方法 f 可以创建当前 class 和 returns 的实例。我如何确保当您调用 A.f() 时,它 returns 是 A 而不是 Base 的实例,对于 B 也是如此?我不想在 A 或 B 上定义此方法。
下面是一些示例代码:
class Base {
name: string;
constructor(name: string) { this.name = name; }
f(): Base /* ? */ {
return Base(name); /* or A(name) or B(name) depending on what "this" is
}
}
class A extends Base { /* stuff */ }
class B extends Base { /* stuff */ }
var a = new A();
a.f() -> returns an instance of A, not Base
您可以利用 constructor
属性:
class Base {
name: string;
constructor(name: string) { this.name = name; }
f(name): Base {
var c:any = this.constructor;
return new c(name); /* or A(name) or B(name) depending on what "this" is */
}
}
class A extends Base { /* stuff */ }
class B extends Base { /* stuff */ }
var a = new A("something");
var foo = a.f("foo") // -> returns an instance of A, not Base
console.log(foo.constructor); // "A"
var b = new B("something else");
var bar = b.f("bar");
console.log(bar.constructor); // "B"
我有一个基础class(基础)和两个子classes A和B。
Base 有一个方法 f 可以创建当前 class 和 returns 的实例。我如何确保当您调用 A.f() 时,它 returns 是 A 而不是 Base 的实例,对于 B 也是如此?我不想在 A 或 B 上定义此方法。
下面是一些示例代码:
class Base {
name: string;
constructor(name: string) { this.name = name; }
f(): Base /* ? */ {
return Base(name); /* or A(name) or B(name) depending on what "this" is
}
}
class A extends Base { /* stuff */ }
class B extends Base { /* stuff */ }
var a = new A();
a.f() -> returns an instance of A, not Base
您可以利用 constructor
属性:
class Base {
name: string;
constructor(name: string) { this.name = name; }
f(name): Base {
var c:any = this.constructor;
return new c(name); /* or A(name) or B(name) depending on what "this" is */
}
}
class A extends Base { /* stuff */ }
class B extends Base { /* stuff */ }
var a = new A("something");
var foo = a.f("foo") // -> returns an instance of A, not Base
console.log(foo.constructor); // "A"
var b = new B("something else");
var bar = b.f("bar");
console.log(bar.constructor); // "B"