我有一个这样的代码:
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",因为类型";电子邮件"|"姓氏"|"name"|"密码"|"电话"以及";en〃’没有重叠">
由于混合了两种不同类型的FirstType
和SecondType
,因此需要从if
语句中排除属性id
,因为检查的是仅出现在SecondType
的属性
key as keyof ObjType;
可以是id
或en
,但仅对第二属性进行检查
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
})