在 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
的值的任何对象。希望有所帮助。祝你好运。
我想要一个像这样的通用 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
的值的任何对象。希望有所帮助。祝你好运。