TypeScript如何定义可选且非空非undefined的属性?
符合API请求体要求的TypeScript类型定义
需求场景
API仅接收以下两种JSON请求体:
const missingProperty = {} const value = { foo: "bar" }
绝对不会接收以下请求体:
const nullish = { foo: null } const undefinedish = { foo: undefined }
尝试过的类型及问题
尝试了几种类型定义,但都无法满足需求:
- 允许显式传入
foo: undefined,不符合要求:
type Foo = { foo?: string, }
- 不允许空对象,且允许显式传入
foo: undefined:
type Foo2 = { foo: string | undefined, }
- 不允许空对象,虽能禁止null/undefined,但不符合需求:
type Foo = { foo: string | never, } const missing: Foo = {} // 不期望的错误 const value: Foo = { foo: "bar" } const nullish: Foo = { foo: null } // 期望的错误 const undefinedish: Foo = { foo: undefined } // 期望的错误
解决方案
可以使用联合类型精确匹配需求:
type Foo = Record<string, never> | { foo: string };
验证效果
const missing: Foo = {}; // ✅ 无错误,符合预期 const value: Foo = { foo: "bar" }; // ✅ 无错误,符合预期 const nullish: Foo = { foo: null }; // ❌ 报错,符合预期 const undefinedish: Foo = { foo: undefined }; // ❌ 报错,符合预期
说明
Record<string, never>表示没有任何可枚举属性的空对象,确保只有纯空对象被允许;- 联合类型的另一分支
{ foo: string }确保当存在foo属性时,其值必须是字符串类型,直接排除了null和undefined的情况。
内容的提问来源于stack exchange,提问作者Daniel Kaplan
相关产品推荐
相关产品推荐

