代码之家  ›  专栏  ›  技术社区  ›  Mero

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

  •  5
  • Mero  · 技术社区  · 3 年前

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

    并得到一个错误:

    没有与此调用匹配的重载。
    “number[]| string[]”类型的参数不能分配给“Iterable | null | undefined”类型的参数。 类型“string[]”不可分配给类型“Iterable”。 “Symbol.iterator.next(…)”返回的类型在这些类型之间不兼容。 输入“IteratorResult<字符串,任意>'不可分配给类型“IteratorResult<编号,任意>'。 类型“IteratorYieldResult”不可分配给类型“IteratorYieldResult”。 类型“string”不可分配给类型“number”。
    重载2/2'(值?:只读数字[]| null |未定义):Set',导致以下错误。 “number[]| string[]”类型的参数不能分配给“readonly number[]| null | undefined”类型的参数。 类型“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
    
    2 回复  |  直到 3 年前
        1
  •  2
  •   Jayce444    3 年前

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

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

    正如乌达尔米克所说,你可以使用 any

        2
  •  0
  •   udalmik    3 年前

    您可以通过将参数强制转换为 any[] :

    function f(arg: number[] | string[]): number[] | string[] {
        return [...new Set(arg as any[])];
    }