修改类型属性的泛型



在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 }

游乐场

最新更新