将对象键映射到 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。如何实现?

Typescript playground

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

Playground