在TypeScript(4.5.2(中,我试图创建一个接受类型并修改其某些属性的泛型。
type StrictNumber = {
doesNotChange: string,
nullable: false,
value: number,
};
type MakeNullable<T extends { nullable: false, value: unknown }> = {
[Property in keyof T]: Property extends 'nullable'
? true
: Property extends 'value'
? T[Property] | null
: T[Property]
};
type NullableNumber = MakeNullable<StrictNumber>;
以下是NullableNumber
:的结果类型
type NullableNumber = {
doesNotChange: string,
nullable: true,
value: number | null,
};
这正是我想要的。然而,MakeNullable
泛型并不是一个优雅的解决方案,它非常冗长。如果我添加更多的属性来修改,那就更麻烦了。
您可以使用条件类型推断value
类型:
type MakeNullable<T extends { nullable: false, value: unknown }> = T extends { value: infer V }
? { nullable: true, value: V | null } : never;
游乐场
如果你想继承所有额外的属性,你可以与原始类型相交,但省略修改后的属性:
type MakeNullable<T extends { nullable: false, value: unknown }> = T extends { value: infer V }
? Omit<T, 'nullable' | 'value'> & { nullable: true, value: V | null } : never;
游乐场
或者更简单(经yossarian船长建议调整(:
type MakeNullable<T extends { nullable: false, value: unknown }> =
Omit<T, 'nullable' | 'value'> & { nullable: true, value: T['value'] | null }
游乐场