我想创建一个像这样的函数签名:
countBy<R, V>(objs: R[], iteratee: ((x: R) => V) | keyof R): Map<V, number> {}
在 lodash 风格中,iteratee
应该是函数 (x: R) => V
或简写 R 的关键
:
countBy(pizzas, pizza => pizza.sauce)
countBy(pizzas, 'sauce')
如何告诉 Typescript,如果我使用简写 ('sauce'
),R[keyof R]
必须生成 V< 类型的值
?
最佳答案
假设您不需要键入函数体(这比较棘手),您可以创建两个重载来实现此目的:
function countBy<R, V>(objs: R[], iteratee: ((x: R) => V)): Map<V, number>
function countBy<R, K extends keyof R, V extends R[K]>(objs: R[], iteratee: K): Map<V, number>
function countBy<R, V>(objs: R[], iteratee: ((x: R) => V) | keyof R): Map<V, number> {
return {} as any
}
关于typescript - 如何表达 "K extends keyof T such that T[K] is of type V"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71533263/