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

时间:2019-08-28 11:42:38

标签: typescript generics typescript-generics

TypeScript中是否有一种方法可以使用index types恰好是一个通用类型声明以下接口,其中map方法将接受与{{ 1}}的密钥而不是T

any

同样,接口只需要接受一种通用类型。以下是可能的解决方案,但是由于采用两种通用类型,因此无法解决此问题:

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

1 个答案:

答案 0 :(得分:1)

您可以使用映射类型来生成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