泛型接口内的Typescript函数用于推断参数类型

xtupzzrd  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(132)

假设我有一个接受泛型的接口:

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。例如,如果我们使用用户界面,'value'参数将是'string|数|布尔值'
Playground链接

eufgjt7s

eufgjt7s1#

我们可以通过Map对象键使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)
}

Playground

相关问题