我试着写一个函数,它把对象A: { [key: string]: string | undefined }
作为输入,输出一个新的对象B
,使得A
中的所有属性都存在于B
中,每个string
属性都转换为number
,每个string | undefined
属性都转换为number | undefined
.
这说明了大体概念:
type In<T> = { [K in keyof T]: string | undefined };
type Out<T> = { [K in keyof T]: T[K] extends undefined ? number | undefined : number };
function transformObject<T extends In<T>>(input: T): Out<T> {
const result = {} as Out<T>;
for (const key in input) {
const value = input[key];
result[key] = value === undefined ? undefined : value.length;
}
return result;
}
const obj = { background: 'red', color: 'blue', border: undefined };
const obj2 = transformObject(obj);
const bgLength: number = obj2.background;
const borderLength: number | undefined = obj2.border;
问题是我不知道如何打字将赋值强制转换为result[key]
.没有as any
类型的演员阵容.我得到以下错误:
Type 'number | undefined' is not assignable to type 'T[Extract<keyof T, string>] extends undefined ? number | undefined : number'.
Type 'undefined' is not assignable to type 'T[Extract<keyof T, string>] extends undefined ? number | undefined : number'.ts(2322)
声明输入和输出对象之间的这种类型的关系的正确方式是什么,其中A
中的所有属性都被声明为B
中的属性,同时还将B
中的可选属性保持为可选的?