【发布时间】:2018-10-06 01:02:16
【问题描述】:
拥有一个只有 getter 属性的类:
class Person {
sureName: string = "";
lastName: string = "";
get name() {
return `${this.sureName} ${this.lastName}`;
}
}
我喜欢紧凑的 C# 初始化方式(例如 string[] array = { "a1", "b1", "c1" };,这在 Typescript 中也是可能的。但是使用这种短类型语法,我不得不设置 name 属性:
let p: Person = {
name: "xyz",
sureName: "a",
lastName: "b"
};
console.log(p); // { name: 'xyz', sureName: 'a', lastName: 'b' }
getter 修饰符似乎被完全忽略了!为什么会出现这种奇怪的行为?使用new运算符时不是这样:
let p1 = new Person();
p1.name = "Peter"; // error TS2540: Cannot assign to 'name' because it is a constant or a read-only property.
这里从 OOP 视图正确验证了 getter。但与第一个相比,我不太喜欢new operator:我对设置所有必填字段没有智能感知,我总是必须输入对象名称作为前缀(p1.xyz),这在设置时很烦人命名对象的多个属性。
但是为了拥有干净的 OOP,我不得不使用 new 语法。或者停止使用像 getter/setter 这样的 C#,而使用像 getName() 这样的方法。
【问题讨论】:
-
当您输入
let p: Person = ...时,您使用的是Person作为 type,它(如果您检查它)不知道 getter / setter 或实现全部。它不是名为Person的class的实例。Person类的所有实例都是Person类型的值,但并非Person类型的所有值都是Person类的实例。
标签: class typescript getter