如何让TypeScript接口的所有可选属性支持null值?
如何给接口所有可选属性添加null类型支持?
给定如下接口:
interface IExample { property1: string; property2: number; property3?: number; property4?: string; }
需求是让该接口的所有可选属性都能接受null值,但不想为每个可选属性单独添加null类型。
你尝试的类型工具无法生效:
type SetOptionalKeysNullable<T> = { [K in keyof T]: T[K] extends undefined ? undefined | null : T[K]; };
问题原因
你写的类型判断逻辑有误:T[K] extends undefined是在判断属性类型是否等于undefined,但可选属性的实际类型是「原类型 | undefined」(比如property3的类型是number | undefined),显然number | undefined并不extendsundefined,所以这个判断不会命中任何可选属性,自然无法添加null类型。
正确的类型工具
需要反过来判断:检查undefined是否是属性类型的子类型(也就是该属性是否为可选属性),修改后的类型如下:
type SetOptionalKeysNullable<T> = { [K in keyof T]: undefined extends T[K] ? T[K] | null : T[K]; };
验证效果
用这个类型处理IExample:
type IExampleWithNullableOptionals = SetOptionalKeysNullable<IExample>;
最终得到的类型等价于:
interface IExampleWithNullableOptionals { property1: string; property2: number; property3?: number | null | undefined; property4?: string | null | undefined; }
所有可选属性现在都支持null值,同时保留了原有的可选特性和必填属性的类型。
内容的提问来源于stack exchange,提问作者Deepak Gupta
相关产品推荐
相关产品推荐

