【问题标题】:TypeError: This condition will always return 'false' since the types '"id"' and '"en"' have no overlapTypeError:此条件将始终返回 'false',因为类型 '"id"' 和 '"en"' 没有重叠
【发布时间】:2021-09-16 00:18:05
【问题描述】:

我有这样的代码:

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" },
  },
];

const language = "en";

data.map((obj: ObjType) => {
  const newObj: {
    [key: string]: ObjType[keyof ObjType];
  } = { key: obj.id };

  Object.keys(obj).forEach((key) => {
    const typedKey = key as keyof ObjType;

    newObj[key] = obj[typedKey];

    if (typedKey !== "id" && typedKey === language && obj[typedKey]) {
      for (let value in obj[typedKey] as LangType) {
        newObj[value] = obj[typedKey][value];
      }
    }
  });

  return newObj;
});

但我收到打字稿错误: "TypeError: 这个条件总是返回 'false',因为类型 '"id"' 和 '"en"' 没有重叠。"

如何解决?我尝试了很多东西,但没有任何效果

已更新。现在出现一个新错误:“此条件将始终返回 'false',因为类型 '"email" | "lastname" | "name" | "password" | "phone"' 和 '"en"' 没有重叠。"

【问题讨论】:

  • SecondType 有属性en 但你使用ru?这怎么可能?
  • @Apostolos 抱歉,实际上是“en”,已更正问题
  • Qwerty,不,你没有

标签: javascript reactjs typescript typescript-typings


【解决方案1】:

由于您将FirstTypeSecondType 两种不同类型混合在一起,因此您需要从if 语句中排除属性id,因为仅检查出现在SecondType 的属性

key as keyof ObjType; 

可能是iden,但仅针对第二个属性进行检查

  if (typedKey !== 'id' && typedKey === language && obj[typedKey]) {

更新答案:

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' }
  }
]

const language = 'en'

data.map((obj: ObjType) => {
  const newObj: {
    [key: string]: ObjType[keyof ObjType];
  } = { key: obj.id }

  Object.keys(obj).forEach(key => {
    type Keys = keyof ObjType
    type LangTypeKeys = keyof LangType
    const typedKey: Keys = key as Keys

    newObj[key] = obj[typedKey]

    if (typedKey.toString() === language && obj[typedKey]) {
      const keys : LangTypeKeys[] = Object.keys(obj[typedKey]) as LangTypeKeys[]
      for (let i = 0; i < keys.length; i++) {
        const lang: LangType = obj[typedKey] as unknown as LangType
        newObj[keys[i]] = (lang as LangType)[keys[i]]
      }
    }
  })

  return newObj
})

【讨论】:

  • 谢谢,这修复了条件中的错误,但错误出现在 for (let value in obj[typedKey]) 中:“'for...in' 语句的右侧必须是 'any' 类型, 对象类型或类型参数,但这里有类型 'never'"
  • 它不起作用,但我做了for (let value in obj[typedKey] as LangType),它起作用了,谢谢
  • 很奇怪。它适用于我的示例代码。无论如何,如果它帮助您解决问题,请不要忘记接受答案。有一个美好的一天。干杯:)
  • 但是如果我有很多数据,而不仅仅是 id 怎么办?例如:interface SecondType { id: number; email: string; lastname: string; name: string; password: string; phone: string; en: LangType; } 有没有其他方法可以查看?
  • 似乎通过使用const typedKey: string | LangType = key as keyof ObjType; 可以消除所有错误。它适用于我的部分代码,至少是我从你的问题中复制的代码。
猜你喜欢
  • 2020-12-11
  • 2019-07-03
  • 2020-01-05
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
  • 2022-11-09
相关资源
最近更新 更多