TypeScript联合类型属性判断报类型无重叠错误如何解决?
报错根因
ObjType 是 FirstType 和 SecondType 的联合类型,联合类型的keyof运算只会返回所有子类型共有的属性,也就是"id" | "email" | "lastname" | "name" | "password" | "phone",独有属性en不会被包含在内。你把遍历得到的key强制断言为keyof ObjType后,typedKey === "en"的判断逻辑上永远为假,TypeScript会直接抛出该报错提醒你逻辑错误。
修复方案
你不需要遍历所有key去判断是否等于语言变量,直接先做类型收窄判断当前对象是否携带语言字段,再做展开处理即可,修复后的完整代码如下:
interface FirstType { id: number; email: string; lastname: string; name: string; password: string; phone: string; } interface SecondType { id: number; email: string; lastname: string; name: string; password: string; phone: string; en: LangType; } interface LangType { name: string; surname: string; } type ObjType = FirstType | SecondType; const data: [FirstType, SecondType] = [ { id: 1, email: "sd", lastname: "ks", name: "sd", password: "sfd", phone: "sdf", }, { id: 1, email: "sd", lastname: "ks", name: "sd", password: "sfd", phone: "sdf", en: { name: "a", surname: "b" }, }, ]; // 给language指定字面量类型,避免类型被拓宽为string const language: "en" = "en"; data.map((obj: ObjType) => { // 先浅拷贝原对象属性,不需要手动遍历赋值 const newObj: Record<string, any> = { ...obj }; // 用in运算符做类型收窄,判断当前对象是否是SecondType if (language in obj) { const langObj = obj[language]; // 展开语言字段下的属性到newObj Object.assign(newObj, langObj); } return newObj; });
核心修复点
- 用
in运算符做类型收窄,直接判断当前对象是否携带对应语言字段,不需要遍历所有key做无效判断 - 移除了错误的
key as keyof ObjType断言,避免非共有属性被排除在类型判断之外 - 给language指定了字面量类型,避免TS将其类型拓宽为普通string导致后续类型判断失效
内容的提问来源于stack exchange,提问作者Qwerty
相关产品推荐
相关产品推荐

