typescript - 如何根据可选参数的类型确定返回类型

标签 typescript generics type-inference optional-parameters

我有以下功能:

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

See this in the typescript playground

如您所见,它需要两个参数,并返回转换为整数的第一个参数,如果无法转换为整数,则返回第二个参数。第二个是可选的,默认为未定义。

我在输入此内容时遇到困难。如果我使用上面的版本:

function test(value: unknown) {
  const r = safeParseInt(value);
  const x: number | "" = safeParseInt(value);
  const y: number | "" = safeParseInt(value, "");
  const z: number | "" = safeParseInt(value, undefined); 
}

我预计 xz 上会出现错误,但 z 上只有一个错误。当我将鼠标悬停在 r 上时,我可以看到返回类型为 unknown

有关默认值的某些内容扰乱了推理。我尝试过返回typeof invalid,完全删除类型提示,使 T 扩展未定义或使其扩展未知。似乎没有任何作用。

最佳答案

您应该使用重载。

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

这将显式地将 safeParseInt 的返回类型设置为 number |如果 invalid 未传递给函数,则未定义


Playground

关于typescript - 如何根据可选参数的类型确定返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75470817/

相关文章:

typescript - 如何在 typescript 中区分具有相同结构的不同异常/类

angular - ionic 2 : Loop through List of Arrays in Object

c# - 将具体对象类型作为泛型方法的参数传递

f# - 如何编写通用数字的函数?

generics - 无法解析具有类型约束的简单 F# 运行时泛型函数

javascript - 将 delay(0) 与 refCount() 结合使用

angular - 使用 Ionic v2 在离开页面(返回)之前发出警报

C# 泛型列表

swift - 使用通用闭包进行类型匹配的奇怪行为

java - 本地类型推断与实例