TypeScript如何根据可选参数是否传入动态改变函数返回类型
报错原因
你写的代码有三个核心问题:
- 重载签名的参数和返回值对应关系完全写反了:当前逻辑是传
defaultValue: number时返回number | null,传defaultValue: undefined时返回number,和你要的需求刚好相反 - 函数实现的返回值没有兼容所有重载签名的类型要求:你定义的第二个重载要求返回
number类型,但实现逻辑里存在return null的分支,TS校验实现时自然会抛出Type 'null' is not assignable to type 'number'错误 - 现有参数定义不支持直接不传值调用,不符合"未传入可选值"的实际使用场景
正确实现
调整重载顺序、参数可选性和类型定义即可,参考代码:
type GetValueFn = { // 传入number类型的defaultValue时,返回值一定是number (values: { defaultValue: number }): number; // 不传defaultValue/传入undefined时,返回值可能为null (values?: { defaultValue?: undefined }): number | null; } const getValue: GetValueFn = ({ defaultValue } = {}) => { const randomValue = Math.ceil(Math.random() * 10) if (randomValue !== 5) return randomValue; if (defaultValue !== undefined) return defaultValue; return null; }
类型效果
调用时TS会自动推导对应类型,完全匹配需求:
// 推导类型为number,可直接使用不需要判空 const withDefault = getValue({ defaultValue: 0 }) // 以下两种调用方式都推导为number | null,使用前需要做null校验 const withoutDefault1 = getValue() const withoutDefault2 = getValue({ defaultValue: undefined })
内容的提问来源于stack exchange,提问作者Asghwor
相关产品推荐
相关产品推荐

