如何为带参数的函数添加flowtype,并使用" arguments"国内

时间:2017-09-27 11:51:12

标签: javascript reactjs flowtype

以下代码来自OSS库(适用于VDOM)。我试图将flowtype添加到生成虚拟DOM节点的h函数中。但请注意,该函数内部使用arguments?它还需要两个输入。想知道如何输入注释。

  1. 第一个参数是字符串或函数。
  2. 第二个参数是一个带有很多键值的对象
  3. 它在内部使用参数,因为函数可以使用N个参数。

    一个。因此该函数必须至少有2个参数(但可以有N个参数)。

    湾从第3个参数开始,这些参数必须是Arraystring类型。

  4. 所以你可以这样称呼:

    1. h("b", {...})
    2. h(()=>{}, {...}, [])
    3. h(()=>{}, {...}, [], [], []..)
    4. h(()=>{}, {...}, [], "string", "string2")

      var i
      var stack = []
      
      export function h(tag, props) {
      var node
      var children = []
      
      for (i = arguments.length; i-- > 2; ) {
       stack.push(arguments[i])
      }
      
      while (stack.length) {
       if (Array.isArray((node = stack.pop()))) {
         for (i = node.length; i--; ) {
           stack.push(node[i])
          }
         } else if (node != null && node !== true && node !== false) {
          children.push(typeof node === "number" ? (node = node + "") : node)
        }
      }
      
       return typeof tag === "string" ? {
               tag: tag,
               props: props || {},
               children: children
             }
             : tag(props, children)
       }
      

1 个答案:

答案 0 :(得分:1)

您需要做的是为您正在使用的库创建libdef,并将其放在项目根目录的flow-typed文件夹中。
或者您也可以将其提交到flow-typed repository

libdef变得那么难。您只需使用以下内容创建文件library-name.js并声明其中的所有函数类型:

declare module 'my-third-party-library' {
  declare type arg1Type = string | () => any;
  declare type arg2Type = {
    [key: string]: any,
  };
  declare type restArgsType = Array<Array<any> | string>;

  declare class className {
    h(arg1: arg1Type, arg2: arg2Type, ...restArgs: restArgsType): void;
  }

  declare var exports: className;
}

原始答案:

  

我认为你可以只指定参数的类型   功能如下:

     
type arg1Type = string | () => any;
type arg2Type = {
  [key: string]: any,
}
type restArgsType = Array<Array<any> | string>
function h(arg1: arg1Type, arg2: arg2Type, ...restArgs: restArgsType){}
     

之后您可以使用以下功能:

     
h('b', obj);
h(func, obj, []);
h(func, obj, [], []);
h(func, obj, [], [], []);
h(func, obj, [], 'string', 'string2')
     

正如您在flow.org/try

上看到的那样