在 TypeScript 中,我如何声明一个带有 2 个参数的泛型,其中第一个是第二个 returns 特定类型的键?

In TypeScript how do I declare a generic with 2 arguments, where the first is a key of the second that returns a specific type?

我想要一个像这样的通用 class:

export abstract class Foo<ID extends keyof T, T> {
    bar(T t) {
        const s: string = t[ID];
    }
}

显然上面的代码无法推断出 t[ID] 的类型,我们得到的是隐式的 any。 我如何强制使用泛型 T[ID] 将成为 string?

您的代码无法编译,所以我将其更改为:

export abstract class Foo<ID extends string, T extends Record<ID, string>> {

  // add a property of type ID.
  constructor(public id: ID) { } 

  // change the Java-esque (T t) to (t: T)
  bar(t: T) {
    //use the id property to index t; can't use type ID at runtime
    const s: string = t[this.id]; 
  }

}

强制执行所需关系的方法是:不是将 ID 约束为 keyof T,而是将 T 约束为 Record<ID, string>,其中 Record<K, V> 是来自 the standard TypeScript library 的类型描述了具有来自 K 的键和来自 V 的值的任何对象。希望有所帮助。祝你好运。