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
相关产品推荐
相关产品推荐

