假设我有一个接受泛型的接口:
interface ObjectKey<T extends {}>{
key: keyof T
doSomethingWithKey: (value: any) => void
}
像这样使用:
interface User {
name: string,
age: number,
archived: boolean
}
const nameKey: ObjectKey<User> = {
key: 'name',
doSomethingWithKey: (value) => console.log(value) // I want to infer value type here
}
如上所述,我想推断'value'参数类型。像这样:
interface ObjectKey<T extends {}>{
key: keyof T
doSomethingWithKey: (value: T[key]) => void
}
我怎么才能做到呢?
我试过这样做:
interface ObjectKey<T extends {}>{
key: keyof T
doSomethingWithKey: (value: { [Property in keyof T]: T[Property] }[keyof T]) => void
}
但是它返回所有可用的t类型。例如,如果我们使用User interface, 'value'参数将是'string | number | boolean'
操场上联系
我们可以通过映射对象键使ObjectKey
成为所有可能组合的并类型
type ObjectKey<T extends {}> = {
[K in keyof T]: {
key: K,
doSomethingWithKey: (value: T[K]) => void
}
}[keyof T]
interface User {
name: string,
age: number,
archived: boolean
}
const nameKey: ObjectKey<User> = {
key: 'age',
doSomethingWithKey: (value) => console.log(value)
}
游乐场