【问题标题】:Can I Specify Parameter Type as One of Many Types Instead of Any Type in TypeScript?我可以将参数类型指定为多种类型之一,而不是 TypeScript 中的任何类型吗?
【发布时间】:2012-09-28 09:39:55
【问题描述】:

在 TypeScript 的方法声明中,参数可以是字符串、布尔值或数字的数组类型。我必须将其声明为 any[] 还是有办法将输入类型限制为这三种类型中的一种?

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    Typescript 1.4 引入了Union Types,所以现在的答案是是的,你可以

    function myFunc(param: string[] | boolean[] | number[]): void;
    

    使用指定类型以外的其他类型将触发编译时错误。


    如果你想要一个包含多个特定类型的数组,你也可以使用联合类型:

    function myFunc(param: (string|boolean|number)[]): void;
    

    请注意,这与 OP 要求的不同。这两个例子有不同的含义。

    【讨论】:

    • 对我来说,这看起来像是一个完全由一种类型组成的数组,其中该类型可以是字符串、布尔值或数字。如果一个数组只能包含这三种类型的混合体呢?
    • 我不确定这是 OP 要求的,但我还是编辑了我的答案。你显然明白两者之间是有区别的。
    • 如果我们想传递除字符串/布尔值/数字以外的类型怎么办?现在有可能,因为我正在尝试使用 myFunc(param: string| Reactelement) 但它给出了错误
    • 这是功能性的做法stackoverflow.com/a/64794158/1948585
    【解决方案2】:

    这似乎是一个有点老的问题,但无论如何,我遇到了它,并错过了我带来的另一个答案。

    从 TypeScript 1.4 开始,似乎可以为函数参数声明多种可能的类型,如下所示:

    class UtilsClass {
        selectDom(element: string | HTMLElement):Array<HTMLElement> {
            //Here will come the "magic-logic"
        }
    }
    

    这是因为“联合类型”的新 TypeScript 概念。

    你可以看到更多here

    【讨论】:

      【解决方案3】:

      您可以使用函数重载来做到这一点:

      class Thing {
          public foo(x: number[]);
          public foo(x: bool[]);
          public foo(x: string[]);
          public foo(x: any[]) {
             // Note: You'll have to do type checking on 'x' manually
             // here if you want differing behavior based on type
          }
      }
      
      // Later...
      var t = new Thing();
      t.foo(someArray); // Note: External callers will not see the any[] signature
      

      【讨论】:

      • 函数重载可能会有所帮助。
      【解决方案4】:

      解决这个问题的另一种方法是找到输入类型之间的通用方法和属性,并在方法声明中声明一个内联类型,以保存这些通用方法和属性。 像这样:

      methodName(param1: { prop1: number; prop2: string; }, param2: { propA: bool; propB: string; } ): methodResultType;
      

      【讨论】:

        【解决方案5】:

        由于字符串、布尔值和数字是原始类型,我认为没有简单的方法。如果您要使用一组不同的对象类型,您可能会想出一个超类,然后在方法的接口中指定该超类。另一方面,您也可以使用方法重载来为字符串、布尔值和整数数组指定不同的实现。

        【讨论】:

        • 超类可以工作,内联类型,包含常用方法和属性。
        猜你喜欢
        • 1970-01-01
        • 2010-10-22
        • 2019-12-11
        • 1970-01-01
        • 2019-12-12
        • 2019-10-25
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多