首页 > 解决方案 > 如果通过括号表示法和常量变量访问,则在类型保护检查后访问对象属性不起作用

问题描述

为什么测试 1 和 2 在这里工作,但测试 3 显示编译器错误foo[barConst]++:'对象可能是“未定义”。'?我经常需要通过括号表示法访问属性,因此喜欢为这些属性设置常量,但 typescript 不允许这样做。它也不适用于const enums。是错误还是错误有充分的理由?

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".'
    }
}

标签: typescript

解决方案


目前似乎不可能通过计算的 propertyNames/literal 表达式来缩小属性访问范围。看看这个问题和它的公关,还有那个问题

您可以使用字符串文字(例如foo["bar"]. 像这样的动态表达式foo[barConst]不起作用。分配foo[barConst]给一个变量并改为使用/缩小该变量是一种替代方法,但需要额外的声明。

在您的情况下,最简单的解决方案是使用非空断言 operator 转换表达式!。当您对虚假值进行预检查时,您在这里是安全的:

function test3(foo?: Foo) {
    if (foo && foo[barConst]) {
        foo[barConst]!++; 
    }
}

推荐阅读