gpt4 book ai didi

typescript - 使用括号表示法访问对象属性时键入缩窄符

转载 作者:搜寻专家 更新时间:2023-10-30 21:44:30 25 4
gpt4 key购买 nike

为什么测试 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".'
}
}

Playground

最佳答案

通过计算的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com