空
empty
には値がありません。これは他のすべての型のサブタイプ(つまりボトムタイプ)です。そう考えると、Mixed
の反対で、それはすべての型のスーパータイプです。
empty
を使用してコードに注釈を付けるのは一般的ではありません。ただし、それが役立つ可能性のある2, 3の状況があります。
常にエラーを発生させる関数がある場合、関数が決して返さないため、戻り値にempty
と注釈を付けます。
1function throwIt(msg: string): empty {2 throw new Error(msg);3}
empty
にキャストを使用して、ユニオンのすべてのメンバーを絞り込んだことをアサートできます。
1function f(x: 'a' | 'b'): number {2 switch (x) {3 case 'a':4 return 1;5 case 'b':6 return 2;7 default:8 return (x: empty);9 }10}
ユニオンのすべてのメンバーをチェックしなかった場合(たとえば、x
を'a' | 'b' | 'c'
に変更した場合)、x
はdefault
でempty
ではなくなり、Flowでエラーが発生します。
注:
empty
にキャストすることなく、既定で徹底的にチェックされた列挙型が必要な場合は、プロジェクトでフロー列挙型を有効にして使用できます。
empty
はすべての型のサブタイプであるため、empty
型の何かでは、すべての操作が許可されます。ただし、empty
になれる値がないため、any
とは異なり、「安全」です。
1const str = "hello";2
3if (typeof str === "string") {4 (str: string); // Yes it's a string5} else {6 // Works! Since we will never enter this branch7 (str: empty);8 const n: number = str + 1;9}
コードの型安全性の欠陥やフロー自体のバグのために、empty
の型指定された値を取得することが可能なので、上記に「safe」を引用符で囲みました。
empty
として型指定されたコードを特定するには、coverageコマンドを使用できます。