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

如何基于可选参数类型确定TypeScript函数的返回类型

解决safeParseInt的类型推断问题

你的问题核心在于泛型T未设置默认类型,导致TypeScript在省略第二个参数时,错误地将T推断为unknown,进而让返回类型变成number | unknown(等价于unknown),这就解释了为什么x没有报错、r的类型是unknown。

修正后的函数实现

调整泛型定义,给T设置默认类型为undefined,同时明确参数的类型约束:

export function safeParseInt<T = undefined>(value: unknown, invalid: T = undefined as T): number | T {
  if ((value ?? "") === "") return invalid;
  const parsed = parseInt(String(value));
  if (isNaN(parsed)) return invalid;
  return parsed;
}

修正后的类型表现

现在再看你的测试代码:

function test(value: unknown) {
  const r = safeParseInt(value); // 类型为 number | undefined
  const x: number | "" = safeParseInt(value); // 报错:不能将类型“number | undefined”分配给类型“number | ""”
  const y: number | "" = safeParseInt(value, ""); // 正常:返回类型为 number | ""
  const z: number | "" = safeParseInt(value, undefined); // 报错:不能将类型“number | undefined”分配给类型“number | ""”
}

完全符合你的预期:x和z都会触发类型错误,r的类型明确为number | undefined,y类型匹配正常。

原理说明

  1. 泛型默认类型:给T设置T = undefined后,当你不传入第二个参数时,TypeScript会自动将T推导为undefined,返回类型固定为number | undefined。
  2. 显式参数的类型推导:当你传入第二个参数(比如""或undefined),TypeScript会根据传入值的类型精准推导T,返回类型也会对应变成number | 传入值类型。

另外,原函数中return value ? parsed : 0的逻辑可以简化为return parsed——因为能走到这个分支的情况,要么value是真值且parsed有效,要么value是0(此时parsed也是0),两种情况返回parsed的结果都是正确的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 01:01:51