在Flow类型中,(a: ?string)和(a?: string)之间有什么区别?

6

a?: stringa: ?string 在Flow中有什么区别?

function concat(a: ?string, b: ?string): string {
}

vs

function concat(a?: string, b?: string): string {
}

1
你可以展示一些用法示例代码吗?输出将有助于我们共同找到解决方案。 - Sid
1
@T.J.Crowder 在这里 https://flow.org/en/docs/types/functions/#optional-parameters- - Rohan
2个回答

12

a: ?string是一个Maybe类型 - 在这种情况下实际上是string | null | void

a?: string是一个可选属性/参数 - string | void

它们之间的区别在于,Maybe类型可以(除了类型本身)还可以是nullvoid,而可选参数只能是void

在调用带有可选或Maybe参数的函数时,function foo(a?: string)function(a: ?string) - 在两种情况下都可以省略参数。

另一个区别在于对象属性 - 只有可选属性可以被省略:

type WithOptional = {
  foo?: string;
}
type WithMaybe = {
  foo: ?string;
}

const a: WithOptional = {}; // OK
const b: WithMaybe = {}; // Error

3

a?: string是一个可选参数。从文档中可以看到:

可选参数会接受缺失、undefined或匹配的类型。但它们不接受null

a: ?string是一个maybe类型。从文档中可以看到:

JavaScript代码中常常引入“可选”值,这样你就有了留空或传递null的选择。

...

Maybe类型接受提供的类型以及nullundefined。所以?number表示numbernullundefined

因此,它们之间最主要的区别似乎是你可以用null来表示maybe类型,但是对于可选参数而言则不能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接