将对象键映射到 class 泛型中的值类型
Map object key to value type in class generic
我有以下代码:
interface Person {
name: string;
age: number;
}
class Store<T, K extends keyof T> {
constructor(private obj: T) { }
get(key: K): T[typeof key] {
return this.obj[key];
}
}
const person: Person = {
name: 'John',
age: 99
};
const store = new Store(person);
const value = store.get('name');
value
类型显示:
const value = store.get('name');
// ^^^^^ value: string | number
如何在给定键作为 class 方法中的参数的情况下推断对象的值类型?
在这种情况下,我希望 value
正确输入为 string
。如何实现?
get
函数本身需要是通用的,这样它才能使用参数的类型。这允许它 return 来自 T
的特定键,例如 T[K]
.
class 上的 K
泛型现在不再有意义。 keyof T
在 class 中的任何地方都是一样的,所以你可以完全删除它。
换句话说 Store
作为 class 不认为任何一个键是特殊的,所以它不需要一个通用的。但是 get
方法需要获取一个特定的键,所以类型系统需要知道是哪个特定的键,所以你需要一个泛型。
class Store<T> {
constructor(private obj: T) { }
get<K extends keyof T>(key: K): T[K] {
return this.obj[key];
}
}
我有以下代码:
interface Person {
name: string;
age: number;
}
class Store<T, K extends keyof T> {
constructor(private obj: T) { }
get(key: K): T[typeof key] {
return this.obj[key];
}
}
const person: Person = {
name: 'John',
age: 99
};
const store = new Store(person);
const value = store.get('name');
value
类型显示:
const value = store.get('name');
// ^^^^^ value: string | number
如何在给定键作为 class 方法中的参数的情况下推断对象的值类型?
在这种情况下,我希望 value
正确输入为 string
。如何实现?
get
函数本身需要是通用的,这样它才能使用参数的类型。这允许它 return 来自 T
的特定键,例如 T[K]
.
class 上的 K
泛型现在不再有意义。 keyof T
在 class 中的任何地方都是一样的,所以你可以完全删除它。
换句话说 Store
作为 class 不认为任何一个键是特殊的,所以它不需要一个通用的。但是 get
方法需要获取一个特定的键,所以类型系统需要知道是哪个特定的键,所以你需要一个泛型。
class Store<T> {
constructor(private obj: T) { }
get<K extends keyof T>(key: K): T[K] {
return this.obj[key];
}
}