Typescript'new'跳过属性

时间:2016-05-10 11:40:49

标签: typescript

我有一个动物类和界面,

interface IAnimal {
    name: string;
}

class Animal {

    // Fields
    _data: IAnimal;

    // Constructor
    constructor(
        data: IAnimal
    ) {
        console.log('name: ' + data.name);
    }

    // Propperties
    get name() {
        return this._data.name
    }

    set name(value: string) {
        if (value.length < 1) {
            alert("No name");
        } else {
            this._data.name = value
        }
    }

}

let lionJon = new Animal({name: ''});

正如您所看到的,我正在创建一个新对象但使用空名称字符串。我希望set name能够发出警告,因为name的值小于1个字符。

相反,它会跳过整个get和set并直接进入构造函数,绕过检查。

2 个答案:

答案 0 :(得分:2)

您似乎正在尝试将C#“属性初始值设定项”语法与您的Animal类型一起使用。但是,您实际在做的是将对象传递给构造函数,然后只打印name属性的值。如果您要遵循具有this.name赋值的console.log语句,您将看到运行时错误:

this._data = new Animal(); // Otherwise we'll get a reference error
console.log('name: ' + data.name);
this.name = data.name;

现在,这应解决您的原始问题,但我确实看到了您的代码的另一个概念性问题:您正在定义一个IAnimal接口,但您在中包含该类接口而不是实施它。虽然这在技术上不是问题,但您应该问自己,Animal IAnimal还是 IAnimal。在这种情况下,我怀疑你打算使用前者,这会使你的代码看起来像:

interface IAnimal {
    name: string;
}

class Animal implements IAnimal {
    // Note that we now have a member to contain the
    // backing value for the 'name' property here instead
    // of the original IAnimal type.
    private _name : string;

    // Constructor
    constructor(
        data: IAnimal
    ) {
        console.log('name: ' + data.name);
        this.name = data.name;
    }

    // Properties
    get name() {
        return this._name
    }

    set name(value: string) {
        if (value.length < 1) {
            alert("No name");
        } else {
            this._name = value;
        }
    }
}

let lionJon = new Animal({name: ''});

答案 1 :(得分:1)

我决定写一个答案,不是为了回答你的问题,而是指出你可能会遇到的问题。

首先,为了回答我在评论中所做的事情,你需要自己调用setter,所以ctor应该看起来像这样:

constructor(data: IAnimal) {
    this.name = data.name;
}

您遇到的另一个问题是您没有为_data成员分配值,因此它应该如下所示:

constructor(data: IAnimal) {
    this._data = {};
    this.name = data.name;
}

然后你会很好,但要注意这样做:

this._data = data;

因为那样你可能会发现自己在Animal的不同实例中有同一个对象的引用。