根据方法中的其他参数推断参数类型

时间:2020-07-20 15:25:50

标签: typescript typescript-typings typescript-generics

假设我有以下函数声明:

function foo<T extends {}>(bar: Array<{ key: keyof T, value: any, otherParam: string}>): T[]

我有这个界面:

interface C {
    d: string
    e: number
}

当我这样调用foo时:

foo<C>([{key: 'd', value: 'myValue', otherParam: 'other'}, {key: 'e', value: 100, otherParam: 'other'}])

我想推断第二个参数value的类型,并摆脱那可怕的any

我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:1)

使用mapped typesT转换为所需的形状。

type Bar<T> = {
    [P in keyof T]: { key: P, value: T[P], otherParam: string }
}[keyof T];

完整解决方案:

type Bar<T> = {
    [P in keyof T]: { key: P, value: T[P], otherParam: string }
}[keyof T];

declare function foo<T extends object>(bar: Bar<T>[]): T[]

interface C {
    d: string
    e: number
}

foo<C>([{key: 'd', value: 'string', otherParam: 'other'}, {key: 'e', value: 100, otherParam: 'other'}])

TypeScript Playground