基于非分布式联合类型的条件判断为何不生效?
判断TypeScript接口是否包含可选属性的正确方式
你当前的判断逻辑存在问题:SomeInterface[keyof SomeInterface]生成的是boolean | number | string | undefined的联合类型,用[该联合类型] extends [undefined]做非分布式判断时,整个联合类型并不等于undefined,因此条件分支会走到string,导致test被推断为string类型。
要准确判断接口是否包含可选属性,推荐利用TypeScript内置的Required<T>工具类型,它会将接口中所有可选属性转换为必填属性。如果原接口与Required<T>生成的类型不一致,说明原接口存在可选属性。
正确代码示例
export interface SomeInterface { someBool: boolean someOptionalNum?: number someOptionalText?: string } // 定义判断可选属性的类型工具 type HasOptionalProperties<T> = T extends Required<T> ? false : true // test的类型将被推断为boolean const test: HasOptionalProperties<SomeInterface> = true
补充说明
Required<SomeInterface>会生成一个所有属性均为必填的新接口,与原SomeInterface对比时,因原接口存在可选属性,T extends Required<T>不成立,因此返回true,符合预期。- 如果用“检查属性类型是否包含undefined”的方式判断,会存在误判风险:若某个必填属性的类型本身就包含
undefined(如someProp: number | undefined),会被错误识别为存在可选属性,而Required的方法则能精准区分可选属性和类型包含undefined的必填属性。
内容的提问来源于stack exchange,提问作者Maxi
相关产品推荐
相关产品推荐

