我正在尝试创建一个函数,它接受数字数组或字符串数组并从该数组返回 Set,如下所示:
const f = (arr: number[] | string[]): number[] | string[] => {
return [...new Set(arr)];
}
并得到一个错误:
没有重载匹配此调用。
重载 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”。类型“字符串”不可分配给类型“数字”。
重载 2 of 2,'(values?: readonly number[] | null | undefined): Set',给出了以下错误。'number[] 类型的参数 | string[]' 不可分配给'readonly number[] 类型的参数 | 空 | 不明确的'。类型 'string[]' 不能分配给类型 'readonly 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