具有索引类型 属性 和方法的通用接口

Generic interface with index-type property and method

在 TypeScript 中有没有一种方法可以使用 index types 一个泛型类型 来声明以下接口,其中 map 方法将接受与 T 的密钥类型相同,而不是 any?

interface Foo<T> {
    key: keyof T;
    map: (value: any) => any;
}

同样,接口只需要接受一种泛型类型。以下是一个可能的解决方案,但没有解决这个问题,因为它采用了两种泛型类型:

interface Foo<T, K extends keyof T> {
    key: K;
    map: (value: T[K]) => any;
}

您可以使用映射类型生成所有 key/map 可能性组合的并集。此联合将强制约束 map 的参数将与 T[K] 的类型相同,上下文类型也将按预期工作:

type Test = {
  a: string;
  b: number;
}

type Foo<T> = { 
  [P in keyof T]: {
      key: P;
      map: (value: T[P]) => any;
  }
}[keyof T]

let o: Foo<Test> =  {
  key: "a", 
  map: v => v.toLocaleLowerCase() // v is string
};

let o2: Foo<Test> =  {
  key: "b", 
  map: v => v.toLocaleLowerCase() // v is number, so err
};

Play