以下代码来自OSS库(适用于VDOM)。我试图将flowtype添加到生成虚拟DOM节点的h
函数中。但请注意,该函数内部使用arguments
?它还需要两个输入。想知道如何输入注释。
它在内部使用参数,因为函数可以使用N个参数。
一个。因此该函数必须至少有2个参数(但可以有N个参数)。
湾从第3个参数开始,这些参数必须是Array
或string
类型。
所以你可以这样称呼:
h("b", {...})
或h(()=>{}, {...}, [])
或h(()=>{}, {...}, [], [], []..)
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)
}
答案 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
上看到的那样