class - 为什么我可以在 Typescript 中设置 getter 属性的值?
问题描述
拥有一个只有 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()
.
解决方案
getter 不会被忽略,如果您创建类的实例,它就会存在。创建实例Person
意味着使用new
运算符(即。new Person()
)。Person
您可以使用instanceof
运算符测试您实际上并未创建 a 的事实
let p: Person = {
name: "xyz",
sureName: "a",
lastName: "b"
};
console.log(p instanceof Person); // will be false
您正在做的是创建一个对象文字(不是 的实例Person
),其形状与Person
. 并且由于它必须具有相同的形状(即相同的公共成员),它也必须具有name
属性。Typescript 使用结构类型,因此这是允许的。有关更多详细信息,请参阅此答案。
如果你想创建一个新的Person
并使用对象文字语法来指定字段值,你可以创建一个带Partial<Person>
参数的构造函数:
class Person {
constructor(value: Partial<Person>) {
Object.assign(this, value);
}
sureName: string = "";
lastName: string = "";
get name() {
return `${this.sureName} ${this.lastName}`;
}
}
var p = new Person({
sureName: "a",
lastName: "b"
})
推荐阅读
- https - create-react-app:如何使用 https 但带有签名证书?
- visual-studio-code - VSCode 中用于 IntelliSense 信息的提供程序是什么?
- android - 显示一个菜单元素并隐藏另一个
- amazon-web-services - AWS API Gateway Websocket 路由缺少 Cognito 信息
- powerbi - Power BI 服务:在计划刷新期间更改日期
- tensorflow - TPU 与 TensorFlow v1
- azure - 为什么 Azure Devops 文件复制静态网站不复制到根目录?
- python - Selenium/Python 根据同一行中的值单击表格单元格中的超链接
- android - 如何通过单击按钮更新自定义 ListView
- ios - 如何在 Swift 中的 UIViewController 和 NSObject 之间传递数据