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

TypeScript 如何从自定义对象类型中完全移除nullable可空属性

解决方案

你可以用 TypeScript 4.1 及以上版本支持的*键重映射(Key Remapping)*语法过滤掉不需要的属性,修改后的CLEAN类型如下:

type CLEAN<T> = {
  // 遍历所有属性,值类型为 null/undefined/void 的属性对应的键会被设为 never 自动过滤
  [P in keyof T as T[P] extends null | undefined | void ? never : P]: NonNullable<T[P]>
};

原理说明

你原来的写法只是修改了属性的值类型,没有过滤属性键,所以值为null的propThree依然会保留在类型中,只是类型被转成了never,导致赋值时要求必须传入该属性却没有合法值可以赋值。

新增的as子句会对遍历到的每一个属性键做判断:如果当前属性的值类型属于null | undefined | void的子集,就把键映射为never,TypeScript 会自动丢弃映射结果中键为never的属性,实现完全删除对应属性的效果。末尾的NonNullable<T[P]>还可以自动把string | null这类联合类型中的空值类型移除,保留实际可用的类型。

代入你的测试用例后,CLEAN<TEST>的推导结果就是预期的{ propOne: string; propTwo: number },变量赋值不会再报错:

type TEST = {
  propOne:string
  propTwo: number
  propThree:null  // 会被完全移除
}

type FIXED = CLEAN<TEST>

const fixed:FIXED={ // 不再报错
    propOne:'',
    propTwo:1,
}

内容的提问来源于stack exchange,提问作者Ivan V.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:09:02