Flow Type ofタイプ(Type of Types)

2548 ワード

Type ofタイプ(Type of Type)
取得値の内部型JavaScriptにはtypeof演算子があり、記述値の文字列を返します.
typeof 1 === 'number'
typeof true === 'boolean'
typeof 'three' === 'string'
しかし、この文字列はタイプだけを記述しています.
typeof { foo: true } === 'object'
typeof { bar: true } === 'object'
typeof [true, false] === 'object'
Flowでは、同様のtypeof演算子が提供されているが、より強力な機能がある.
typeofタイプ文法
typeof演算子は、与えられた値のFlowタイプをタイプとして返します.
// @flow
let num1 = 42;
let num2: typeof num1 = 3.14;     // Works!
// $ExpectError
let num3: typeof num1 = 'world';  // Error!

let bool1 = true;
let bool2: typeof bool1 = false;  // Works!
// $ExpectError
let bool3: typeof bool1 = 42;     // Error!

let str1 = 'hello';
let str2: typeof str1 = 'world'; // Works!
// $ExpectError
let str3: typeof str1 = false;   // Error!
どんな値に対しても使えます.
// @flow
let obj1 = { foo: 1, bar: true, baz: 'three' };
let obj2: typeof obj1 = { foo: 42, bar: false, baz: 'hello' };

let arr1 = [1, 2, 3];
let arr2: typeof arr1 = [3, 2, 1];
typeof継承導出挙動
Flowはあなたのコードに対して様々なタイプの導出を行います.typeofを使用すると、Flowの推理結果をタイプとして宣言します.これは非常に役に立つかもしれないが、思わぬ結果をもたらすこともある.
例えば、Flowで文字どおりの量の値を使う場合、それらの導出タイプはその属する基本タイプである.したがって、数字42は、導出されたデジタルタイプを有する.これはあなたが使うときに見られます.
// @flow
let num1 = 42;
let num2: typeof num1 = 3.14;    // Works!

let bool1 = true;
let bool2: typeof bool1 = false; // Works!

let str1 = 'hello';
let str2: typeof str1 = 'world'; // Works!
しかし、これは導き出すタイプにしか起こりません.字面の種類を指定するとtypeofで使われます.
// @flow
var num1: 42 = 42;
// $ExpectError
var num2: typeof num1 = 3.14;    // Error!

let bool1: true = true;
// $ExpectError
let bool2: typeof bool1 = false; // Error!

let str1: 'hello' = 'hello';
// $ExpectError
let str2: typeof str1 = 'world'; // Error!
typeofが他のタイプの行動を継承します.
Flowには多くの異なるタイプがあり、いくつかのタイプの挙動は他のタイプとは異なる.これらの違いはこの特定のタイプにとって意味がありますが、他のタイプに対しては意味がありません.
typeofを使うと、他のタイプのすべての行動が入ります.したがって、typeofの表現は一定であるとは限らない.
例えば、typeofをクラスで使う場合、クラスは構造タイプではなく名義上のタイプであることを覚えておく必要があります.したがって、同じ形状を持つ2つのクラスは同じとは考えられない.
// @flow
class MyClass {
  method(val: number) { /* ... */ }
}

class YourClass {
  method(val: number) { /* ... */ }
}

// $ExpectError
let test1: typeof MyClass = YourClass; // Error!
let test1: typeof MyClass = MyClass;   // Works!