在以下函数定义中:
function foo(a: number = 42): number {return a+1;}
...... a: number
注释的语义是什么?
是否说变量 a 总是在里面有一个值 函数的主体还是说客户程序员在打电话时应该总是提供一个值?
我注意到以下代码片段都没有错误的类型检查(使用flow-bin 0.57.3):
function foo(a: number = 42): number {return a+1;}
type FooT= (a: number)=> number
(foo: FooT)
foo();
(试试here)
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)
答案 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
一样