You need to enable JavaScript to run this app. TypeScript联合类型属性判断报类型无重叠错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 03:12:03