TypeScript:如何创建一个根据条件返回数组的条件类型?

syd*_*ydd 5 typescript typescript-generics

我正在尝试输入一个函数,如果输入参数是数组类型,则该函数应返回数组类型,否则返回普通参数。这是我的尝试:

function test<T extends number|number[]>(a: T):T extends number[] ? string[] : string {
  if (Array.isArray(a)) {
    return ['123', '45']
  }
  return '123'
}
Run Code Online (Sandbox Code Playgroud)

我在返回语句中收到错误:Type 'string' is not assignable to type 'T extends number[] ? string[] : string'.

我正在寻找的是以下内容:

const a = test(3) // "a" is string type
const b = test([1,2,3]) // "b" is string[] type
Run Code Online (Sandbox Code Playgroud)

Ali*_*adi 2

基于此, Typescript 不会根据函数中的类型保护推断出不同的返回类型。但是您可以像这样定义多个函数签名:

function test(a: number): string;
function test(a: number[]): string[];

function test<T extends number|number[]>(a: T): string | string[]{ 
  if (Array.isArray(a)) {
    return ['123', '45'] 
  }
  let str = '123'
  return str;
}

const a = test(3) //string
const b = test([1,2,3]) //string[]
Run Code Online (Sandbox Code Playgroud)

游乐场链接

另请参阅此问题:https ://github.com/microsoft/TypeScript/issues/24929