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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:31:00