首页 > 解决方案 > 元素在转换中隐式具有任何类型

问题描述

我不知道如何正确键入此函数:

function makeTransform<TObj extends Record<string,any>, K extends keyof TObj>(transformer: Record<K, (x:TObj[K])=>any>): (o:TObj)=>any {
    return (obj: TObj) => {
        const out: any = {...obj}
        for (const k of Object.keys(transformer)) {
            out[k] = transformer[k](obj[k])
        }
        return out;
    }
}

用法:

const trans = makeTransform({a:x => x*2});
const arr = [{a:1,b:2},{a:3,b:4}];
console.log(arr.map(trans)) // [ { a: 2, b: 2 }, { a: 6, b: 4 } ]

错误:

我知道它正在接收,stringRecord<string,any>我不确定我还能放什么?它应该只有字符串键,但transformer应该有来自TObj.

标签: typescript

解决方案


归功于用户k48(答案:https ://stackoverflow.com/a/55721107/5536304 )

以下解决方案编译:

function makeTransform<TObj extends Record<string, any>, K extends keyof TObj>(transformer: Record<K, (x: TObj[K]) => any>): (o: TObj) => any {
    return (obj: TObj) => {
      const out: any = { ...obj }
        for (const k in transformer) {
          out[k] = transformer[k](obj[k]);
        }
        return out;
    }
}

const trans = makeTransform({ a: x => x * 2 });

const arr = [{a:1,b:2},{a:3,b:4}];
console.log(arr.map(trans)) // [ { a: 2, b: 2 }, { a: 6, b: 4 } ]

推荐阅读