You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript类型守卫仍报Object is possibly 'undefined'问题求助

问题原因&解决办法

类型错误的根本原因

你碰到的这个Object is possibly 'undefined'错误,核心是TypeScript没法对动态键的对象属性做可靠的类型窄化。虽然你写了判断string1Map[key]是不是undefined或0的逻辑,但key是个动态变化的字符串变量,TypeScript的类型系统没办法确定:在你做完这个判断之后,string1Map[key]的类型不会发生变化(哪怕你这里没修改它,但类型系统不认这种“假设”),所以它不会自动把这个属性的类型从number | undefined缩窄成number。

另外你加了非空断言!还报错,本质是因为string1Map被定义成了Record<string, number | undefined>,这个类型本身就规定了所有字符串键对应的属性都可能是undefined,类型守卫没办法覆盖这种全局的类型定义。

顺带提个逻辑bug

你的循环条件写错了:idx <= string1.length和idx <= string2.length会多跑一次循环,最后一次取string1[idx]的时候,idx等于字符串长度,拿到的是undefined,这会把undefined当键存进string1Map,完全不符合你统计字符的逻辑,得改成idx < string1.length和idx < string2.length。

几种解决方式

方式1:用类型断言明确类型

既然类型守卫没法自动缩窄类型,直接告诉TypeScript这个属性肯定是数字:

(string1Map[key] as number) -= 1;

方式2:优化对象的类型定义

一开始就把string1Map定义成Record<string, number>,因为你初始化的时候每个键都会被赋值成数字,不会有undefined。修改成这样:

const string1Map: Record<string, number> = {} as Record<string, number>;

for (let idx = 0; idx < string1.length; idx += 1) {
    const key = string1[idx];
    string1Map[key] = (string1Map[key] ?? 0) + 1;
}

这样后续访问string1Map[key]时,TypeScript就知道它是数字类型,不会再报undefined的错。

方式3:用Map替代普通对象(最省心)

用Map<string, number>来存字符计数,TypeScript对Map的类型推断更友好,完全不用手动处理类型断言:

function validAnagram(string1: string, string2: string): boolean {
    if (string1.length !== string2.length) {
        return false;
    }

    const string1Map = new Map<string, number>();

    for (let idx = 0; idx < string1.length; idx += 1) {
        const key = string1[idx];
        string1Map.set(key, (string1Map.get(key) ?? 0) + 1);
    }

    for (let idx = 0; idx < string2.length; idx += 1) {
        const key = string2[idx];
        const count = string1Map.get(key);
        if (count === undefined || count === 0) {
            return false;
        }
        string1Map.set(key, count - 1);
    }

    return true;
}

内容的提问来源于stack exchange,提问作者roberto22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:45:24