首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类属性: TypeScript中的“对象可能未定义”

类属性: TypeScript中的“对象可能未定义”
EN

Stack Overflow用户
提问于 2021-05-18 06:40:32
回答 1查看 158关注 0票数 1

这看起来像是一个非常简单的打字代码片段:

代码语言:javascript
运行
复制
class Example {
    private items: Record<string, number[]> = {}

    example(key: string): void {
        if (this.items[key] === undefined) {
            this.items[key] = []
        }
        this.items[key].push(1)
    }
}

但是对于this.items[key].push(1),它会给出以下错误

代码语言:javascript
运行
复制
Object is possibly 'undefined'.ts(2532)

这是可行的:

代码语言:javascript
运行
复制
this.items[key]?.push(1)

但是我想要理解为什么编译器不尊重显式的未定义检查。

EN

回答 1

Stack Overflow用户

发布于 2021-05-18 07:37:38

Typescript显示此错误是因为您没有正确检查变量是否未定义。看起来您在到达块之前就定义了它,但它可能没有被定义。

这就是为什么你不应该禁用noUncheckedIndexedAccess -在这种情况下-它会引入一个bug的位置。

仅供参考-添加?在键的末尾是告诉ts,你知道键已经定义了--不要检查。如果可能的话,应该避免这种情况。

未检查-您的原始检查

代码语言:javascript
运行
复制
    example(key: string): void {
        // this is checking before your push
        if (this.items[key] === undefined) {
            this.items[key] = []
        }
        // independent from previous check and still reachable even if the variable is undefined
        this.items[key].push(1)
    }

正在检查

代码语言:javascript
运行
复制
    example(key: string): void {
        const item = this.items[key];
        if (!item) {
            this.items[key] = [1]
        } else {
            item.push(1)
        }
    }

顺便说一句,当检查一个键是否存在时,一种比仅仅检查它是否未定义更可靠的方法是this.items.hasOwnProperty(key)!(key in this.itmes),因为一个值可能是未定义的,如果检查未定义的值,将会得到与您预期相反的结果。

这不适用于上面的示例,因为它在检查之前被转换为变量,因此它只能是字符串或未定义的-它不能包含未定义的值

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67577846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档