在以下函数定义中:
function foo(a: number = 42): number {return a+1;}
Run Code Online (Sandbox Code Playgroud)
...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();
Run Code Online (Sandbox Code Playgroud)
(在这里试试)
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 …Run Code Online (Sandbox Code Playgroud) 使用'?'时很困惑 在流动中.AFAIK(感谢param之前或之后的流式问号?):
什么时候 '?' 在':'之前,表示bar是可选的,可以是字符串或未定义:
bar?: string
什么时候 '?' 在':'之后,表示bar可能是type,可以是string,undefined或null.
bar: ?string
我的问题是:在哪种情况下,我们应该在第二种情况下选择第一种方案?怎么样bar?: ?string?
流很难......