使用默认值

时间:2017-12-13 03:14:32

标签: flowtype

在以下函数定义中:

 function foo(a: number = 42): number {return a+1;}

...... a: number注释的语义是什么?

是否说变量 a 总是在里面有一个值 函数的主体还是说客户程序员在打电话时应该总是提供一个值?

我注意到以下代码片段都没有错误的类型检查(使用flow-bin 0.57.3):

摘录1

function foo(a: number = 42): number {return a+1;}
type FooT= (a: number)=> number

(foo: FooT)

foo();

(试试here

摘录2

function foo(a: ?number = 42): number {return a+1;}
type FooT = (a: ?number)=> number

(foo: FooT)

foo();

(试试here

在这种情况下,建议的注释方式是什么?

我的偏好是方式#2,因为客户端程序员只需查看FooT类型的定义即可意识到该参数是可选的。这让我可以告诉用户我的 library:“只需查看函数的类型(FooT)”。

然而,对于方式#1,我必须告诉他们“函数的类型(FooT)似乎表明需要一个参数,但实际上并不是因为,看,如果你看一下在实现中,提供了一个默认值“。

那么,哪个片段更惯用?

请注意,相关问题存在answer,似乎表明可以在函数的实现中将类型注释为必需的,并在声明中将其作为可选项。但在这种情况下,这似乎不起作用。例如。以下不进行类型检查:

function foo(a: number = 42): number {return a+1;}
type FooT = (a: ?number)=> number

(foo: FooT)

foo();

(试试here

1 个答案:

答案 0 :(得分:3)

你可以选择:

function foo(a: number = 42): number {return a+1;}
type FooT = (a?: number)=> number

(foo: FooT)

foo();

注意类型定义中的?位置:

(a?: number) - optional参数

VS

(a: ?number) - maybe类型

两者之间的唯一区别是可选参数不能为空,就像parameter with default value

一样