这里是代码的例子.
enum Keys {
Key1 = 'key1',
Key2 = 'key2',
}
type A = {
[Keys.Key1]?: {
value: string;
};
[Keys.Key2]?: {
value: number;
};
};
type B = {
[Keys.Key1]?: string;
[Keys.Key2]?: number;
};
function func(obj: A): B {
return Object.values(Keys).reduce(
(prev, key) => {
if (key in obj) {
prev[key] = obj[key].value;
}
return prev;
},
<B>{},
);
}
第prev[key] = obj[key].value;
行显示错误
Type 'string | number' is not assignable to type 'undefined'.
Type 'string' is not assignable to type 'undefined'.ts(2322)
我可以这样做:
prev[key] = (obj[key] as any).value;
或者通过代码定义来缩小类型:
function func(obj: A): B {
return Object.values(Keys).reduce((prev, key) => {
if (key in obj) {
switch (key) {
case Keys.Key1:
prev[key] = obj[key]?.value;
break;
case Keys.Key2:
prev[key] = obj[key]?.value;
break;
}
}
return prev;
}, {} as B);
}
有没有方法在不改变代码的情况下通过类型编写安全的代码?因为可以有复杂的类型,比如B中的属性数,而A中的属性数|null,我想看到我不能将对象A转换为对象B.有任何它不会工作.