为什么测试 1 和 2 在这里工作,但测试 3 在 foo[barConst]++
处显示编译器错误:“对象可能是“未定义的”。'?我经常需要通过括号表示法访问属性,因此喜欢为这些属性设置常量,但 TypeScript 不允许这样做。它也不适用于 const enum
。这是错误还是有充分的错误原因?
const barConst = 'bar';
interface Foo {
[barConst]?: number;
}
function test1(foo?: Foo) {
if (foo && foo.bar) {
foo.bar++;
}
}
function test2(foo?: Foo) {
if (foo && foo['bar']) {
foo['bar']++;
}
}
function test3(foo?: Foo) {
if (foo && foo[barConst]) {
foo[barConst]++; // compiler error: 'Object is possibly "undefined".'
}
}
最佳答案
通过计算的 propertyNames/literal 表达式缩小属性访问范围目前似乎是不可能的。看看这个issue及其 PR , 还有 that issue .
您可以使用字符串文字在括号表示法中缩小属性访问范围,例如 foo["bar"]
。 foo[barConst]
等动态表达式不起作用。将 foo[barConst]
分配给一个变量并处理/缩小这个变量是一种替代方法,但需要额外的声明。
在您的情况下,最简单的解决方案是使用非空断言运算符 !
强制转换表达式。当您对虚假值进行预检查时,您在这里是安全的:
function test3(foo?: Foo) {
if (foo && foo[barConst]) {
foo[barConst]!++;
}
}
关于typescript - 使用括号表示法访问对象属性时键入缩窄符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57888073/