2017-04-22 54 views
3

我在编写通用映射函数时遇到了一些语法错误。Javascript Flow通用函数语法

function mymap<A, B>(fun: (_: A) => B, array: Array<A>): Array<B> { 
    let result: Array<B> = []; 
    for (let i of array) 
     result.push(fun(i)); 
    return result; 
} 

let x = mymap<number, number>(x => x, [1, 2, 3]); 
          ^Unexpected token  

Flow说:Unexpected token >。我究竟做错了什么?感谢您的帮助。

+0

在哪个'''s? – Bergi

+0

第二个'number'类型声明 – zyks

回答

2

Flow只是一个类型检查器。虽然它不允许泛型实现的类型重载,但在调用函数时不应指定类型。 Flow将仅尝试检查参数是否与函数的签名兼容,并扣除输出类型。所以,你只需要编写

let x = mymap(x => x, [1, 2, 3]); 

和流量会扣除表达的输出类型,并将其应用到x变量。

或者你可以显式指定类型的x

let x: Array<number> = mymap(x => x, [1, 2, 3]); 

在这种情况下流量可以比较扣除的类型与所需要的类型,如果你错误地将使用不正确的映射功能类似x => x.toString(),然后流会提醒你:

let x: Array<number> = mymap(x => x.toString(), [1, 2, 3]); 
//   ^string   ^This type is incompatible with number 
+0

谢谢,我现在明白了。那么是否无法将函数调用限制为同质列表?即这显示了一个错误:'mymap(x => x,[1,'b',3])' – zyks

+1

似乎Flow不能做到这一点。顺便说一下,在TypeScript中,你的初始版本会使用'mymap (...)'。 – artptr