打字稿覆盖构造函数中的扩展属性

时间:2014-12-29 22:30:02

标签: javascript typescript

我遇到了Typescript的问题,我扩展了一个类并从super覆盖了一个属性,但是当我实例化子类时,仍然在构造函数中读取了超类属性。请参阅以下示例:

class Person {

    public type:string = 'Generic Person';

    public constructor() {
        console.log(this.type);
    }

}

class Clown extends Person {

    public type:string = 'Scary Clown';

}

var person = new Person(), // 'Generic Person'
    clown = new Clown(); // 'Generic Person'

console.log(person.type); // 'Generic Person'
console.log(clown.type); // 'Scary Clown'

我的预期行为将是“可怕的小丑”。当我实例化一个小丑的实例。有没有其他方法可以实现这一点,而无需将值传递给构造函数本身或具有某种我在实例化后手动触发的init方法?

提前致谢:)

2 个答案:

答案 0 :(得分:4)

在构造函数的手动输入主体之前,>在属性初始值设定项的顶部插入。所以

class Person {
    public type:string = 'Generic Person';
    public constructor() {
        console.log(this.type);
    }
}

变为

var Person = (function () {
    function Person() {
        this.type = 'Generic Person';
        // NOTE: You want a different value for `type`
        console.log(this.type);
    }
    return Person;
})();

正如您所看到的那样,使用属性初始值设定项,无法在父构造函数体中获取不同的type

或者不要使用type并依赖内置的constructor属性:

interface Function{name?:string;}

class Person {    
    public constructor() {
        console.log(this.constructor.name);
    }
}

class Clown extends Person {    
}

var person = new Person(), // 'Person'
    clown = new Clown(); // 'Clown'

console.log(person.constructor.name); // 'Person'
console.log(clown.constructor.name); // 'Clown'

答案 1 :(得分:-2)

您需要在构造函数中设置属性的默认值,如下所示:

class Person {
    type:string = 'Generic Person';
    constructor() {
        console.log(this.type);
    }
}
class Clown extends Person {
    constructor() {
        this.type = 'Scary Clown';
        super();
    }
}