TypeScript 从数字或字符串数​​组创建集合/数组

Mer*_*ero 8 javascript arrays typescript

我正在尝试创建一个函数,它接受数字数组或字符串数​​组并从该数组返回 Set,如下所示:

const f = (arr: number[] | string[]): number[] | string[] => {
    return [...new Set(arr)]; 
}
Run Code Online (Sandbox Code Playgroud)

并得到一个错误:

没有重载与此调用匹配。
重载 1 of 2, '(iterable?: Iterable | null | undefined): Set' 出现以下错误。'number[] | 类型的参数 string[]' 不可分配给 'Iterable | 类型的参数 空 | 不明确的'。类型“string[]”不可分配给类型“Iterable”。“Symbol.iterator.next(...)”返回的类型在这些类型之间不兼容。类型“IteratorResult<string,any>”不可分配给类型“IteratorResult<number,any>”。类型“IteratorYieldResult”不可分配给类型“IteratorResult<number, any>”。类型“IteratorYieldResult”不可分配给类型“IteratorYieldResult”。类型“string”不可分配给类型“number”。
重载 2 个,共 2 个,“(values?: readonly number[] | null | undefined): Set”,出现以下错误。'number[] | 类型的参数 string[]' 不可分配给 'readonly number[] | 类型的参数 空 | 不明确的'。类型“string[]”不可分配给类型“readonly number[]”。类型“string”不可分配给类型“number”。

我可以将传入类型从 更改number[] | string[](number | string)[],但这意味着数组中可以同时包含数字和字符串,这不是我想要的

const f = (arr: (number | string)[]): (number | string)[] => {
    return [...new Set(arr)];
}

f([1,2,3]);        // ok
f(['1','2','3']);  // ok
f([1,2,'3','4']);  // ok, but should be err
f([true, {}, 1]);  // err, like it should be
Run Code Online (Sandbox Code Playgroud)

Jay*_*444 4

编辑:似乎这与某些 TS 配置有关。一种方法是展开您要从中创建集合的数组并转换返回值,如下所示:

const f = (arr: number[] | string[]): number[] | string[] => {
    return Array.from(new Set([...arr])) as number[] | string[];
}
Run Code Online (Sandbox Code Playgroud)

正如 udalmik 所说,你可以使用any,但这有点违背了要点。