TypeScript如何仅将boolean类型属性转为可选避免ts2741错误
TypeScript 仅将对象boolean类型属性设为可选的实现方案
你原本的单映射遍历写法无法实现需求:可选修饰符?是作用于映射类型的所有遍历属性,不能在值类型的判断分支单独定义,所以需要调整泛型结构,通过键重映射拆分两类属性后交叉合并实现:
type A = { a: number b: boolean } type C<T> = // 保留所有值非boolean的必选属性 { [K in keyof T as T[K] extends boolean ? never : K]: T[K] } & // 仅将值为boolean的属性转为可选 Partial<{ [K in keyof T as T[K] extends boolean ? K : never]: T[K] }> type D = C<A> // 最终推导结果:{ a: number } & { b?: boolean },等效于 { a: number; b?: boolean }
说明
- 该实现不会给boolean属性联合
undefined类型,不会触发TS2741类型校验错误。 - 如果你使用的TypeScript版本低于4.1(不支持键重映射
as语法),可以改用Extract工具类型实现兼容版本:
type BooleanKeys<T> = { [K in keyof T]: T[K] extends boolean ? K : never }[keyof T] type NonBooleanKeys<T> = { [K in keyof T]: T[K] extends boolean ? never : K }[keyof T] type C<T> = Pick<T, NonBooleanKeys<T>> & Partial<Pick<T, BooleanKeys<T>>>
内容的提问来源于stack exchange,提问作者Acid Coder
相关产品推荐
相关产品推荐

