私は地図にアレイを投影する機能を書いた:Typescript型の推論に失敗しましたか?
function toMap<T,TKey,TElement>(items: Array<T>,
keySelector: (item: T) => TKey,
elementSelector: (item: T) => TElement
): Map<TKey,TElement> {
var map = new Map<TKey,TElement>();
for (var item of items) {
map.set(keySelector(item), elementSelector(item));
}
return map;
}
基本的には、リストを反復処理し、Mapのキーと値を抽出するためにユーザーが提供する射影関数を呼び出します。 。
:タイプ処理鍵とTElementが渡されている投影関数の戻り値からinferedされていることを注意
の時間のほとんどを、マップに値は、単に元の要素であります
var personBySocial = toMap(people, person => person.ssn, person => person);
私はその2番目のラムダをデフォルトにしたいと思います。簡単に十分な:私は別途にitem => item
を渡した場合、私はそれを渡すと、活字体はそのTElement == Tを推測することができますが、何らかの理由で
Type '(item: T) => T' is not assignable to type '(item: T) => TElement'.
Type 'T' is not assignable to type 'TElement'.
:
function toMap<T,TKey,TElement>(items: Array<T>,
keySelector: (item: T) => TKey,
elementSelector: (item: T) => TElement = item => item
): Map<TKey,TElement> {
var map = new Map<TKey,TElement>();
for (var item of items) {
map.set(keySelector(item), elementSelector(item));
}
return map;
}
しかし、これはコンパイルエラーが発生しますデフォルトでは、それはできません。
ここで何か間違っているのですか、これはTypescriptの現在の制限ですか?それが後者の場合は、将来明らかにされる既知の問題かどうかは誰にも分かりますか?
EDIT、ライアンさんのコメントに反応して:
function toMap<T,TKey>(items: Array<T>, keySelector: (item: T) => TKey): Map<TKey,T>;
function toMap<T,TKey, TElement>(items: Array<T>, keySelector: (item: T) => TKey, elementSelector: (item: T) => TElement): Map<TKey, TElement>;
function toMap<T,TKey, TElement>(items: Array<T>, keySelector: (item: T) => TKey, elementSelector?: (item: T) => TElement): Map<TKey, TElement> {
var map = new Map<TKey, TElement>();
if (elementSelector)
for (var item of items)
map.set(keySelector(item), elementSelector(item));
else
for (var item of items)
map.set(keySelector(item), item);
return map;
}
私はelse節(map.set(keySelector(item), item)
)でmap.setは上のエラーをトリガされているのと同じタイプのエラー、に実行していますよ第2のitem
は、 "TがタイプTElementのパラメータに割り当てられない"ということを意味する。
それ苦情は完璧な理にかなって:
コンパイラの視点からあなたのコードについて正当な苦情は、誰かが手動ですべての型パラメータを指定しますが、オプションの引数を指定していないかもしれないということです。私はあなたの最初の例(2つの署名)を実装しようとしたときに、同じ型エラーに陥っています。私は自分のコードを自分の投稿に含めました。 – Mud