You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:18:04