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

TypeScript联合类型含可选键时属性访问报错问题咨询

TypeScript联合类型访问非共有属性报错的原因解释

先还原你的代码场景:

type A = {
  k?: string;
  j?: number;
};

type B = {
  k?: number;
};

type C = A | B;

function D(obj: C) {
  // 报错:Property 'j' does not exist on type 'B'
  console.log(obj.j);
}

报错的核心原因

TypeScript的联合类型遵循严格的类型安全规则:只有当某个属性是联合类型中所有成员都具备的公共属性时,才能直接访问该属性。

在你的场景里:

  • 联合类型C是A和B的集合,传入D的参数可能是A类型,也可能是B类型。
  • B类型完全没有定义j属性,一旦传入的是B实例,运行时访问obj.j会得到undefined,甚至可能引发潜在问题。
  • 哪怕j在A里是可选属性,TypeScript也不会放松检查——因为联合类型的安全访问范围只取所有成员的属性交集,j不在这个交集中,所以直接访问会触发编译错误。

解决方法

要安全访问j,需要通过类型守卫缩小类型范围,明确告诉TypeScript当前参数是A类型:

function D(obj: C) {
  // 使用in操作符做类型守卫
  if ('j' in obj) {
    // 此处TypeScript会推断obj为A类型,可安全访问j
    console.log(obj.j);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:02