通用扩展类型解析

时间:2017-06-19 22:46:56

标签: typescript type-resolution

鉴于此功能

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[],这意味着IIternumber[],这意味着TVal 必须number

但是,如果我将签名更改为:

 export function filterMap2<TVal,TRet>(obj: Iterable<TVal>, callback: (v: TVal, k: number, i: Iterable<TVal>) => TRet|symbol): TRet[] {

然后一切都解决得很好。但是,此签名并不具体:我想表明i 与<{1>}完全相同

这只是TypeScript的限制,还是我做错了什么?

0 个答案:

没有答案