Sim*_*ver 5 getter-setter typescript
在 Typescript 中编写属性 setter 时,不需要同时包含 getter:
set name(name: string)
{
...
}
Run Code Online (Sandbox Code Playgroud)
this.name但是,当通过(未定义)访问相应的属性 getter 时,它不是编译时错误并返回 value undefined。我不明白为什么,也找不到任何关于它的讨论。
const theName = this.name; // undefined at runtime, but typed as 'string'
Run Code Online (Sandbox Code Playgroud)
我很可能会意外地陷入这种情况,并且在极少数情况下我没有立即注意到,这可能会浪费大量时间。
定义属性的“传统”方式就是这样,所以也许这可以解释为什么做出这个决定。
Object.defineProperty(Dog.prototype, "name", {
set: function (name) {
},
enumerable: false,
configurable: true
});
Run Code Online (Sandbox Code Playgroud)
当然是一厢情愿的想法,但我更希望这种行为是返回传入的原始“原始”值 - 这将是惊人的。并避免这种可怕的混乱:-/
set name(name: string)
{
this._name = name;
doNameStuff(name);
}
get name()
{
return this._name;
}
private _name!: string;
Run Code Online (Sandbox Code Playgroud)
是的,这是 TypeScript 中的一个健全性漏洞。编译器很乐意让您编写一个set没有相应访问器的属性访问器get,但它不能很好地模拟属性的结果行为。从概念上讲,具有 setter 但没有 getter 的属性应该是“ writeonly”,就像具有 getter 但没有 setter 的属性一样readonly。事实上,如果您编写 getter 但没有 setter,编译器会推断该属性是readonly:
const foo = {
get bar() { return 1 }
}
/* const foo: {
readonly bar: number;
} */
Run Code Online (Sandbox Code Playgroud)
但目前 TypeScript 中还没有这样的东西writeonly,编译器将这样的属性建模为普通的读写属性:
const baz = {
set qux(x: number) { }
}
/* const baz: {
qux: number;
} */
Run Code Online (Sandbox Code Playgroud)
microsoft/TypeScript#21759上有一个长期悬而未决的问题,要求提供writeonly属性,但尚不清楚是否或何时会解决该问题。
TypeScript 4.3 引入了对变体访问器的一些支持,允许类型系统对不同的 getter 和 setter 类型进行建模。但目前有一个要求,即 getter 类型需要可分配给 setter 类型。你不能表达 setter 接受(比如说),number但 getter 总是产生undefined。因此, microsoft/TypeScript#43662上还有另一个未解决的问题 ,要求在 setter 和 getter 中提供不相关的类型。如果实现的话,这将是另一种对无 getter setter 进行建模的方法;众所周知,读取该属性总是会产生undefined. 不过,目前还不清楚这是否会得到实施。
并且有一些建议让 getterless setter 成为编译器错误,例如microsoft/TypeScript#30852但这看起来会被拒绝,因为这将是现有 TypeScript 代码的重大更改......尽管在我看来只会破坏已经做了奇怪事情的代码。但我不负责。
不管怎样,正如我在评论中提到的,我现在能想到的唯一建议是让某人使用ESLint 的访问器对 linter 规则。如果你忘记了 getter,这条规则会抱怨,所以至少你会被迫编写更安全的代码。
| 归档时间: |
|
| 查看次数: |
1403 次 |
| 最近记录: |