流中的参数变化
有时你可能希望函数能够采用不同类型的参数。有点像TypeScript 中的联合类型。让我们看看如何使用Flow来实现。
创建一个接受多种类型参数的函数
这只是列出可能的类型的问题,用|:
function capitalize(
// `capitalize` can take a string or an array of strings.
words: string | Array<string>,
// `capitalize` will return an array of strings either way.
): Array<string> {
// At this point, Flow does not know if `words` is a string or an array,
// so properties or methods specific to those types,
// such as `map` and `toUpperCase`, cannot be accessed.
// However, properties or methods that are shared by both, such as `length`, can be accessed.
if (!Array.isArray(words)) {
// Flow now knows that `words` is a string, so we can use string methods.
return [words.toUpperCase()];
}
// Flow now knows that `words` is an array, so we can use array methods.
return words.map(word => word.toUpperCase());
}
帮助流程确定类型
上面的例子用来Array.isArray
判断 的类型words
,但是 Flow 还有其他方法可以做到这一点:
// Through truthiness
function cube(val: number | void): number {
// If `val` is falsy, it must be undefined (or 0).
if (!val) {
return 0;
}
// Otherwise, `val` must be a number.
return val ** 3;
}
// With typeof
function getDigits(val: string | number): number {
// If typeof val is 'number', it must be a number.
if (typeof val === 'number') {
return Math.ceil(Math.log10(val));
}
// Otherwise,`val` must be a string.
return val.length;
}
// With instanceof
function getName(name: string | Nametag): string {
// If `name` is an instance of the class `Nametag`, it must be a Nametag.
if (name instanceof Nametag) {
return name.name;
}
// Otherwise, `name` must be a string.
return name;
}