当定义函数类型并且我们试图进行类型检查的函数表达式具有以下内容时,这是关于Flow类型检查的声明:(a)更多或(b)参数少于定义的类型。
以下是应该进行的类型检查,这里没有问题。
declare type TFunctionNumberToBoolean = (n: number) => boolean;
const f: TFunctionNumberToBoolean = function isEven(n: number) {return n%2==0;}
以下情况(案例A ),其中规范的“布尔数字”函数类型更改如下:
( n:number )=>布尔
...没有做出类型检查:
declare type TFunctionNumberToBoolean = () => boolean;
const f: TFunctionNumberToBoolean = function isEven(n: number) {return n%2==0;}
以下情况(案例B ),其中规范的“布尔数字”函数类型更改如下:
(n:数字,foo:数字)=>布尔
...... typechecks:
declare type TFunctionNumberToBoolean = (n: number, foo: number) => boolean;
const f: TFunctionNumberToBoolean = function isEven(n: number) {return n%2==0;}
案例A (比定义的函数类型更多的参数)背后的原因是什么不是类型检查而是案例B (比定义的函数类型少的参数)类型检查?我天真地认为可以为相反的行为提出一个更直观的论点。
我正在使用Flow 0.35。
答案 0 :(得分:1)
假设你有一个函数,它接受一个对象的两个属性并对它们求和:
function sum(obj) {
return obj.a + obj.b;
}
如果传递其他参数会怎样?没什么不好的,它会被忽略。
如果你没有传递任何参数,会发生什么?您将获得TypeError: Cannot read property 'a' of undefined
。
传递更多参数是安全的,传递较少的参数是不安全的。