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

Nullish Coalescing运算符在TypeScript场景中失效问题求助

问题:访问联合类型属性时的类型错误及解决方法

先看你的代码:

interface Day {
    dayNumber: number;
    color: string;
    isBooked: boolean;
}

const myDay: Day | 0 = {
    dayNumber: 12,
    color: "blue",
    isBooked: false,
}

const daysArray: (Day | 0)[] = [0, 0, 0, myDay]

for (let i=0; i<4; i++) {
    console.log(daysArray[i].dayNumber ?? 0)
    // Error: Property 'dayNumber' does not exist on type '0 | Day'.
}

报错原因

TypeScript对联合类型的属性访问有严格检查:只有当某个属性在所有联合类型成员上都存在时,才能直接访问。你的daysArray[i]是Day | 0类型,0是数字类型,没有dayNumber属性,所以直接访问这个属性会触发类型错误。

空值合并运算符??的作用是处理属性存在但值为null/undefined的场景,它无法解决“属性本身不存在”的类型问题——因为TypeScript在你访问属性的第一步就已经阻止了这个操作。

解决方法

方法1:使用类型守卫判断类型

先判断当前项是Day类型还是数字0,再分别处理:

// 自定义类型谓词,明确判断是否为Day类型
function isDay(item: Day | 0): item is Day {
    return typeof item === 'object' && item !== null && 'dayNumber' in item;
}

for (let i=0; i<4; i++) {
    const item = daysArray[i];
    console.log(isDay(item) ? item.dayNumber : 0);
}

或者用更简洁的typeof判断(因为0是数字类型,Day是对象类型):

for (let i=0; i<4; i++) {
    const item = daysArray[i];
    console.log(typeof item === 'object' ? item.dayNumber : 0);
}

方法2:可选链+空值合并

用可选链?.处理属性不存在的情况,配合空值合并运算符返回默认值0:

for (let i=0; i<4; i++) {
    console.log(daysArray[i]?.dayNumber ?? 0);
}

可选链?.会在当前值不是对象/为null/undefined时返回undefined,此时空值合并运算符??会将undefined替换为0,同时TypeScript也会认可这种写法的类型安全性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:55:18