【问题标题】:type-checking function signatures with less or more arguments带有更少或更多参数的类型检查函数签名
【发布时间】:2016-12-17 22:20:13
【问题描述】:

这是关于流类型检查声明,当一个函数类型被定义并且我们试图类型检查的函数表达式具有:(a) 比定义的类型更多或 (b) 更少的参数。

下面的类型检查是应该的,这里没有问题。

declare type TFunctionNumberToBoolean = (n: number) => boolean;
const f: TFunctionNumberToBoolean = function isEven(n: number) {return n%2==0;}

以下情况(case A),其中规范的“数字转布尔”函数类型更改如下:

(n: number) => 布尔值

... 不进行类型检查:

declare type TFunctionNumberToBoolean = () => boolean;

const f: TFunctionNumberToBoolean = function isEven(n: number) {return n%2==0;}

以下情况(case B),其中规范的“数字转布尔”函数类型更改如下:

(n: number, foo :number) => 布尔值

…类型检查:

declare type TFunctionNumberToBoolean = (n: number, foo: number) => boolean;

const f: TFunctionNumberToBoolean = function isEven(n: number) {return n%2==0;}

Case A(比定义的函数类型更多的参数)不是类型检查而是 Case B(比定义的函数类型更少的参数)类型检查背后的原因是什么?我天真地认为,可以为相反的行为更直观地提出论据。

我正在使用 Flow 0.35。

【问题讨论】:

  • 澄清您的示例可能会很好,因为我花了一分钟才意识到您在传递带有一个参数的函数时询问的是零参数与两个参数的情况。

标签: flowtype


【解决方案1】:

假设你有一个函数,它接受一个对象的两个属性并将它们相加:

function sum(obj) {
  return obj.a + obj.b;
}

如果你传递额外的参数会发生什么?没什么不好的,会被忽略的。

如果你不传递参数会发生什么?你会得到TypeError: Cannot read property 'a' of undefined

传递更多的参数是安全的,传递更少的参数是不安全的。

【讨论】:

  • 当您提供的函数实现使用 更多 个参数而不是函数类型时,Flow 会报错。
  • 因为使用这种类型,您将传递 less 个参数而不是函数实现实际所需的参数
猜你喜欢
  • 2019-03-13
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
  • 2021-12-09
  • 2021-05-31
  • 2023-01-31
相关资源
最近更新 更多