从参数失败推断出的三元 return 类型(打字稿)

Ternary return type inferred from parameter failure (Typescript)

经过长时间阅读问题和查看文档后,我仍然需要帮助。 我的问题很简单。我想定义一个函数,当一个数组作为参数给出时,它 return 是一个数组,但 Typescript 从不让我 return 想要的值。

我在这里简化了我想编写的函数,因为错误仍然存​​在。

function notWorkingTernary(val: number | number[]) : typeof val extends number[] ? string[] : string{
  if(Array.isArray(val)){
    return val.map(v=>String(v));
  }
  else{
    return String(val);
  }
}

此函数在第一个 return(第 3 行)出现以下错误: Type 'string[]' is not assignable to type 'string'.ts(2322)

我不明白为什么 Typescript 要我 return 一个字符串类型,即使这里的 val 类型显然是一个数字数组。

如果我避免给出 return 类型,那么 return 类型总是字符串 | string[] 并且我每次使用该函数时都必须自己输入 return。

我做错了什么?

您想使用 function signature overloading。在您的情况下,它应该如下所示:

function notWorkingTernary(val: number): string;
function notWorkingTernary(val: number[]): string[];

function notWorkingTernary(val: number | number[]): (string | string[]) {
  if(Array.isArray(val)){
    return val.map(v=>String(v));
  }
  else{
    return String(val);
  }
}

基本上,您有一个函数具有多个“类型重载”,这些“类型重载”在运行时处理,并且通过声明类型您保证运行时与类型兼容。

Typescript playground.

function notWorkingTernary<T extends number | number[]>(val: T): T extends number[] ? string[] : string{
  if(Array.isArray(val)){
    return val.map(v=>String(v)) as T extends number[] ? string[] : string;
  }
  else{
    return String(val) as T extends number[] ? string[] : string;
  }
}

也许有人知道摆脱 as T extends number[] ? string[] : string 的聪明方法?