【问题标题】:Generic interface with index-type property and method具有索引类型属性和方法的通用接口
【发布时间】:2020-01-01 15:14:20
【问题描述】:

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;
}

【问题讨论】:

    标签: typescript generics typescript-generics


    【解决方案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

    【讨论】:

    • 这个。是。疯狂的。 ?
    • 这太疯狂了!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2019-12-06
    • 2019-05-01
    • 2019-02-23
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多