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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:03:49