鉴于此功能
export function filterMap2<TVal,TRet,TIter extends Iterable<TVal>=TVal[]>(obj: TIter, callback: (v: TVal, k: number, i: TIter) => TRet|symbol): TRet[] {
let accum = [];
let i = 0;
for(let x of obj) {
let y = callback(x, i++, obj);
if(y !== __skip__) {
accum.push(y as TRet);
}
}
return accum;
}
这个测试:
const numbers = [1, 2, 3, 4, 5];
expect(filterMap2(numbers, x => {
if(x % 2 === 0) {
return __skip__;
}
return x * 2;
})).toEqual([2, 6, 10]);
打字稿似乎无法解析x
的类型,即使numbers
显然是number[]
,这意味着IIter
是number[]
,这意味着TVal
必须为number
。
但是,如果我将签名更改为:
export function filterMap2<TVal,TRet>(obj: Iterable<TVal>, callback: (v: TVal, k: number, i: Iterable<TVal>) => TRet|symbol): TRet[] {
然后一切都解决得很好。但是,此签名并不具体:我想表明i
与<{1>}完全相同。
这只是TypeScript的限制,还是我做错了什么?