Typescript告诉我“string | T[]”不可分配给“ReadonlyArray”类型的参数

Typescript告诉我“string | T[]”不可分配给“ReadonlyArray”类型的参数,typescript,function,generics,set,overloading,Typescript,Function,Generics,Set,Overloading,我正在构建一个名为unique的简单函数 这样做的目的是删除数组或字符串中的所有重复项,因此它具有函数重载 请参见此问题代码示例: 函数uniquestr:string:string[]; 函数uniquearr:T[]:T[]; /** *创建一个没有重复项的“数组”。 */ 函数uniquearroString:string | T[]:string[]| T[]{ return[…new SetarrOrString];//typescript将在这一行对我大喊大叫。 } 导出默认值唯一;

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

这样做的目的是删除数组或字符串中的所有重复项,因此它具有函数重载

请参见此问题代码示例:

函数uniquestr:string:string[]; 函数uniquearr:T[]:T[]; /** *创建一个没有重复项的“数组”。 */ 函数uniquearroString:string | T[]:string[]| T[]{ return[…new SetarrOrString];//typescript将在这一行对我大喊大叫。 } 导出默认值唯一; 但是,如果我将代码更改为if-else,但实际上什么也不做,typescript现在可以满足以下要求:

//相同的代码,但实际上是编译。 函数uniquestr:string:string[]; 函数uniquearr:T[]:T[]; /** *创建一个没有重复项的“数组”。 */ 函数uniquearroString:string | T[]:string[]| T[]{ 如果arrOrString的类型=='string'{ 返回[…新设置字符串]; }否则{ 返回[…新设置字符串]; } } 导出默认值唯一; 为什么会这样?我必须写两次[…new SetarrOrString]才能让它工作吗?

这是因为集合构造函数不能接受类型字符串| 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[]