typescript - 如果通过括号表示法和常量变量访问,则在类型保护检查后访问对象属性不起作用
问题描述
为什么测试 1 和 2 在这里工作,但测试 3 显示编译器错误foo[barConst]++
:'对象可能是“未定义”。'?我经常需要通过括号表示法访问属性,因此喜欢为这些属性设置常量,但 typescript 不允许这样做。它也不适用于const enum
s。是错误还是错误有充分的理由?
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 表达式来缩小属性访问范围。看看这个问题和它的公关,还有那个问题。
您可以使用字符串文字(例如foo["bar"]
. 像这样的动态表达式foo[barConst]
不起作用。分配foo[barConst]
给一个变量并改为使用/缩小该变量是一种替代方法,但需要额外的声明。
在您的情况下,最简单的解决方案是使用非空断言 operator 转换表达式!
。当您对虚假值进行预检查时,您在这里是安全的:
function test3(foo?: Foo) {
if (foo && foo[barConst]) {
foo[barConst]!++;
}
}
推荐阅读
- ruby-on-rails - ruby-elasticsearch 创建带有属性的索引查询不起作用
- spring-boot - 恰好有一次生产者变慢
- python - 如何在 Python 中生成具有许多零值的随机数列表?
- c - 文件问题中的错误输出但是当我用 1 个正确的输出替换 7 时
- sql-server - OPENDATASOURCE 在@DynamicSQL 中不起作用
- python - 在使用所有身份验证的 Django 中,我想为下面提供的以下信息制作一个没有 REST 框架的自定义 API
- javascript - 我想生成多个随机数并将它们相加,但所有数字的相加必须等于 100
- python - Airflow 基于从 Master dag 传递的消息创建动态 dag
- json - 在 asp core web api 中混合 fileupload 和 raw json 是不可能的吗?
- notion-api - 如何添加和/或修改数据库架构?