TypeScript:基类中的多态返回类型?

时间:2015-01-03 23:42:59

标签: typescript

我有一个基类(Base)和两个子类A和B.

Base有一个方法f,它创建当前类的实例并返回它。如何确保在调用A.f()时,它返回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

1 个答案:

答案 0 :(得分:6)

您可以利用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"