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

标签 typescript properties type-narrowing

为什么测试 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/

相关文章:

使用 gulp-typescript 在 VS2015 中未显示 Typescript 编译错误

c# - 在 C# 中动态设置属性类型

Spring:如何做透明的运行时可变属性配置

gradle - 通过命令行通过Gradle名称中的点提供系统属性

typescript - 如何在 TypeScript 中链接/连接/关联两个类字段的类型?

typescript - 有没有办法通过检查函数来实现类型缩小?

c++ - 列表初始化时需要缩小转换

html - 如何设置页面上最后一个 Angular 组件的样式?

javascript - 将 window.require 与 Electron 和 TypeScript 与 create-react-app 结合使用时缺少输入

javascript - Angular - 自定义元素不适用于 Firefox 和 Microsoft Edge 和 Internet Explorer