如何基于可选参数类型确定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类型匹配正常。
原理说明
- 泛型默认类型:给
T设置T = undefined后,当你不传入第二个参数时,TypeScript会自动将T推导为undefined,返回类型固定为number | undefined。 - 显式参数的类型推导:当你传入第二个参数(比如
""或undefined),TypeScript会根据传入值的类型精准推导T,返回类型也会对应变成number | 传入值类型。
另外,原函数中return value ? parsed : 0的逻辑可以简化为return parsed——因为能走到这个分支的情况,要么value是真值且parsed有效,要么value是0(此时parsed也是0),两种情况返回parsed的结果都是正确的。
内容的提问来源于stack exchange,提问作者kaan_atakan
相关产品推荐
相关产品推荐

