打字稿对我大喊: T []'不可分配给'ReadonlyArray <t>类型的参数

时间:2019-03-10 07:36:24

标签: typescript function generics set overloading

我正在构建一个名为parent Class MyBasket()的简单函数。

这是从数组或字符串中删除所有重复项,因此它具有unique

请参见此问题代码示例:

function overloading

enter image description here

enter image description here

但是,如果我将代码更改为if-else却实际上什么也没做,那么打字稿现在就满足了:

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;

为什么会这样?我必须写两次 // 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; 才能使其正常工作吗?

1 个答案:

答案 0 :(得分:1)

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

这实际上是一件好事。

您的代码可用于两种情况:输入为string或输入为T[]

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

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[]