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

TypeScript如何实现类型为undefined的函数参数可省略传入?

解决方案

你可以通过两种常用的TypeScript类型写法实现需求:

方法1:函数重载(可读性最优)

直接针对不同变体的参数情况定义重载签名,TS会自动匹配对应的参数校验规则:

type VariantTypes = {
  Apple: {
    amount: number
  },
  Air: undefined
}

// 重载签名1:对应配置为undefined的变体,仅需传第一个参数
function Spawn<T extends keyof VariantTypes>(
  variant: T extends infer U ? VariantTypes[U] extends undefined ? U : never : never
): void
// 重载签名2:对应配置为非undefined的变体,必须传两个参数
function Spawn<T extends keyof VariantTypes>(
  variant: T,
  prefs: VariantTypes[T] extends undefined ? never : VariantTypes[T]
): void
// 实现签名
function Spawn(variant: keyof VariantTypes, prefs?: any) {
  // 你的业务逻辑
}

// 测试用例
Spawn('Apple', { amount: 7 }) // 正常通过
Spawn('Air') // 正常通过,无类型报错
Spawn('Air', undefined) // 也兼容原来的写法
Spawn('Apple') // 会触发类型错误,符合预期

方法2:剩余参数条件推导(写法最简洁)

通过条件类型动态推导第二个参数是否需要传入,无需写多个重载签名:

type VariantTypes = {
  Apple: {
    amount: number
  },
  Air: undefined
}

function Spawn<T extends keyof VariantTypes>(
  variant: T,
  // 当配置类型为undefined时,第二个参数不需要传入;否则必须传入对应类型的配置
  ...args: VariantTypes[T] extends undefined ? [] : [prefs: VariantTypes[T]]
) {
  const prefs = args[0]
  // 你的业务逻辑
}

// 测试用例
Spawn('Apple', { amount: 7 }) // 正常通过
Spawn('Air') // 正常通过,无类型报错
Spawn('Apple') // 会触发类型错误,符合预期

两种方案都能完全满足你的需求,可根据你的代码风格选择使用。

内容的提问来源于stack exchange,提问作者Rey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 18:24:00