代码之家  ›  专栏  ›  技术社区  ›  Danny Delott

在函数之间传递参数时出现TypeScript错误

  •  4
  • Danny Delott  · 技术社区  · 7 年前

    此模式引发TypeScript错误:

    类型为“string[]| number[]”

    function foo(value: string | number) {
      return bar([value]); // <- TypeScript error
    }
    
    function bar(valueList: string[] | number[]) {
      ..does something...
    }
    

    是否有一种类型安全的方法来实现这一点?我只能想投给 any[] 这感觉很糟糕:

    function foo(value: string | number) {
      const valueList: any[] = [value];
      return bar(valueList);
    }
    
    3 回复  |  直到 7 年前
        1
  •  4
  •   jonrsharpe    7 年前

    一种方法是 declaration merging ; 为函数定义两个单独的接口(请参见 function types ),然后是it的单个实现:

    interface Foo {
        (value: string): void;
    }
    
    interface Foo {
        (value: number): void;
    }
    
    const foo: Foo = function (value) {
      return bar([value]);
    }
    

    这将使这两种类型保持分离,因为在任何给定时间只能通过其中一种接口进行调用。

        2
  •  2
  •   jonrsharpe    7 年前

    这是从jonrsharpe的答案中得到启发的,但它没有使用单独的接口,而是使用函数重载。

    函数重载允许我们为单个实现指定多个签名: https://www.typescriptlang.org/docs/handbook/functions.html#overloads

    function foo(value: string);
    function foo(value: number);
    function foo(value: any) {
        return bar([value]);
    }
    
    function bar(valueList: number[] | string[]) {
    }
    
        3
  •  1
  •   Nurbol Alpysbayev    7 年前

    另一个答案是好的(我投了更高的票),但我个人同意

    return bar([value] as string[] | number[]);
    

    特别是如果我时间不够的话。这并不意味着它是错误的或有黑客行为,你只是暗示了一点愚蠢的(在本例中)打字脚本。

    P.S.@paleo提到,这不是完全类型安全的。