打字稿告诉我 'string | T[]' 不能分配给 'ReadonlyArray<T> ' 类型的参数

Typescript yells me that 'string | T[]' is not assignable to parameter of type 'ReadonlyArray<T> '

我正在构建一个名为 unique 的简单函数。

这样做是为了删除数组或字符串中的所有重复项,因此它具有 function overloading.

请看这个问题代码示例:

function unique(str: string): string[];
function unique<T>(arr: T[]): T[];

/**
 * Create an `array` without duplicates.
 */

function unique<T>(arrOrString: string | T[]): string[] | T[] {
  return [...new Set(arrOrString)]; // typescript will yell at me at this line.
}

export default unique;

但是,如果我将我的代码更改为 if-else 但实际上什么都不做,打字稿现在满足这个:


// same code, but actually compiling.

function unique(str: string): string[];
function unique<T>(arr: T[]): T[];

/**
 * Create an `array` without duplicates.
 */

function unique<T>(arrOrString: string | T[]): string[] | T[] {
  if (typeof arrOrString === 'string') {
    return [...new Set(arrOrString)];
  } else {
    return [...new Set(arrOrString)];
  }
}

export default unique;

为什么会这样?我必须写两次 [...new Set(arrOrString)] 才能让它工作吗?

这是因为 Set() 构造函数不能采用 string | T[].

类型

其实是个好东西

您的代码适用于两种情况:输入为 stringT[]

使用函数重载可以使您的代码更易于使用:

function unique<T>(arrOrString: string): string[]
function unique<T>(arrOrString: T[]): T[]
function unique<T>(arrOrString: any): any {
    return [...new Set(arrOrString)];
}

const y = unique('x') // y is string[]

const p = unique([1, 2, 3]) // p is number[]