2017-08-19 2 views
0

関数内でフローのジェネリック型アノテーションを使用することは可能ですか?たとえば、アイテムがジェネリックタイプであるかどうかに基づいてアイテムをフィルタリングする場合などです。Facebook Flowの関数内でジェネリック型アノテーションを使用する方法

// @flow 
class Base {} 

function filterItems<T>(items: Base[]) { 
    return items.filter(x => /* How to filter for 'x is T' here?*/); 
} 

したがって、次のコード、aの結果は、単一Fooを含む配列であろう。

class Foo extends Base {} 
const a = filter<Foo>([new Base(), new Foo()]); 

答えて

4

フロータイプは注釈のみの構文です。フロータイプコードをJavaScriptに変換するには、アノテーションを削除する必要があります。これは、タイプが実行時に存在しないため、あなたが求めているものは不可能であることを意味します。あなたが欲しいもの

を行うために、私はこのようなだけやって、通常のJSをお勧めしたい:

function filter<T: Base>(type: Class<T>, items: Array<Base>): Array<T> { 
    return items.reduce((acc, item) => { 
    if (item instanceof type) acc.push(item); 
    return acc; 
    }, []); 
} 

const a = filter(Foo, [new Base(), new Foo()]); 
+0

をありがとう - 私はラウンドに正方形のペグを入れしようとしていたと思いました穴! –

関連する問題