我有一个动物类和界面,
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并直接进入构造函数,绕过检查。
答案 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
的不同实例中有同一个对象的引用。