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)
编辑:似乎这与某些 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,但这有点违背了要点。