Kie*_*lus 6 javascript flowtype
是否可以根据条件在流中键入变量?像这样的东西:
const type = 'xyz';
const a: (type === 'xyz') ? number : string;
Run Code Online (Sandbox Code Playgroud)
小智 13
可以使用类型调用($Call类型)模拟Flow中的类型级条件:
type $If<X: boolean, Then, Else = empty> = $Call<
& ((true, Then, Else) => Then)
& ((false, Then, Else) => Else),
X,
Then,
Else,
>;
type $Not<X: boolean> = $If<X, false, true>;
type $And<X: boolean, Y: boolean> = $If<X, Y, false>;
type $Or<X: boolean, Y: boolean> = $If<X, true, Y>;
type $Gte<X, Y> = $Call<
& ($Subtype<X> => true)
& (mixed => false),
Y,
>;
// Usage example:
declare var a: $Gte<number, string>;
/* error 1 */ (a: true);
/* ok */ (a: false);
declare var b: $Gte<number, number>;
/* ok */ (b: true);
/* error 2 */ (b: false);
declare var c: $If<true, 1, 2>;
/* ok */ (c: 1);
/* error 3 */ (c: 2);
declare var d: $If<false, 1, 2>;
/* error 4 */ (d: 1);
/* ok */ (d: 2);
Run Code Online (Sandbox Code Playgroud)
更多用法示例可以在要点中找到.
最简洁的答案是不.变量必须绑定到单个类型,可以包含类似的联合类型number | string.在条件块内部,Flow可以推断出更专业的类型.例如:
const a: number | string = "foo";
if(typeof a === "string"){
a.split(); // OK!
} else {
a.split(); // Error! a is a number
}
Run Code Online (Sandbox Code Playgroud)
但请注意,这些条件分支是静态的,并且在编译时保证每个条件内的类型.
| 归档时间: |
|
| 查看次数: |
1894 次 |
| 最近记录: |