2017-10-14 9 views
0

私はasyncライブラリの*-as-promised versionをタイプスクリプトで、@types/asyncタイプを再利用しようとしています。TypeScriptで別々の関数宣言をマージするには?

export function filter<T, E>(arr: T[] | IterableIterator<T>, iterator: AsyncBooleanIterator<T, E>, callback?: AsyncResultArrayCallback<T, E>): void; 
export function filter<T, E>(arr: Dictionary<T>, iterator: AsyncBooleanIterator<T, E>, callback?: AsyncResultArrayCallback<T, E>): void; 

しかし、私にonly export one .filter function

function filter<T>(
    arr: async.Dictionary<T> | T[] | IterableIterator<T>, 
    iterator: (item: T) => Promise<boolean> 
): Promise<Array<(T | undefined)> | undefined> { 
    return new Promise((resolve, reject) => { 
    async.filter(arr, (item, cb) => { 
     iterator(item) 
     .then(res => cb(undefined, res)) 
     .catch(err => cb(err)); 
    }, (err, results) => 
     err 
     ? reject(err) 
     : resolve(results) 
    ); 
    }); 
} 

コンパイル、これは私に次のエラーを与える

私の問題は@types/async at the .filter functionが同じ名前を持つ2つの機能の種類をエクスポートしているということです

lib/filter.ts(32,18): error TS2345: Argument of type 'Dictionary<T> | IterableIterator<T> | T[]' is not assignable to parameter of type 'Dictionary<T>'. 
    Type 'IterableIterator<T>' is not assignable to type 'Dictionary<T>'. 

だから、どのように私はこれらの宣言をただ一つにマージできますか?

ありがとう。

答えて

1

タイピングは、arrパラメータの3つのタイプの和集合を持つ単一の関数シグニチャではありません。 asyncタイピングライブラリに問題またはプルリクエストを提出して修正することを検討することをおすすめします。

コンパイラが関数を呼び出すことができるのであれば、それが安全であることがわかっているので、それはいいと思います。しかし、あなたが見る通り、少なくともTypeScript v2.5では、it won'tです。

最も簡単な回避策:あなたは、コンパイラは、既存のfilter機能が実際にタイプT[] | IterableIterator<T> | Dictionary<T>arr受け入れること、すなわち...知らない何の事実を知っているので、心配しないようにコンパイラに指示しても安全ですarrをアサートすることにより、型チェックを無効にするタイプanyは次のとおりです。

function filter<T>(
    arr: async.Dictionary<T> | T[] | IterableIterator<T>, 
    iterator: (item: T) => Promise<boolean> 
): Promise<Array<(T | undefined)> | undefined> { 
    return new Promise((resolve, reject) => { 
    async.filter(arr as any, (item, cb) => { 
     iterator(item) 
     .then(res => cb(undefined, res)) 
     .catch(err => cb(err)); 
    }, (err, results) => 
     err 
     ? reject(err) 
     : resolve(results) 
    ); 
    }); 
} 

arrの種類に応じて2つの呼び出しにasync.filter()への呼び出しを分割するuser-defined type guardを書くなど、他の回避策があります。 関数をintersectFunction()のようなものでラップして、必要な共用体を受け入れるようにしてください。しかし、これらの回避策はより大きくなり、実行時の影響がありますので、上記のas anyメソッドに従ってください。

希望があれば、がんばろう!

+0

私はその解決策、おかげで行く@jcalz! –

関連する問題