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
相关产品推荐
相关产品推荐

