具有默认值的参数的类型注释

Mar*_*tus 5 flowtype

在以下函数定义中:

 function foo(a: number = 42): number {return a+1;}
Run Code Online (Sandbox Code Playgroud)

...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();
Run Code Online (Sandbox Code Playgroud)

在这里试试)

片段 2

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

(foo: FooT)

foo();
Run Code Online (Sandbox Code Playgroud)

在这里试试)

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

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

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

那么,哪个片段更惯用呢?

请注意,有一个相关问题的答案似乎表明可以将类型注释为函数实现中的强制类型和声明中的可选类型。但这在这种情况下似乎不起作用。例如,以下不进行类型检查:

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

(foo: FooT)

foo();
Run Code Online (Sandbox Code Playgroud)

在这里试试)

Ale*_* L. 7

你可以去:

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

(foo: FooT)

foo();
Run Code Online (Sandbox Code Playgroud)

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

(a?: number)-可选参数

对比

(a: ?number)-也许输入

两者唯一的区别是可选参数不能为 null,就像带默认值参数一样