约束泛型的对象属性类型

时间:2020-10-16 08:49:05

标签: typescript types typescript-typings

假设我们有一些参数是字符串的函数

const action = (param: string) => {
    return param;
};

有一个通用类型

interface Relation<T, K extends keyof T> {
    store: T;
    storeKey: K;
}

该函数接受类型为Relation的参数并执行action

const testFunction = <T, K extends keyof T>({ store, storeKey }: Relation<T, K>) => {
    action(store[storeKey]);
};

现在TypeScript错误消息为store[storeKey] is not assignable to type string,我理解原因。如果testFunction不是字符串(没有类型保护,只有静态类型检查),有什么方法可以“弃用” T[K]的调用?

UPD:T不仅可以具有字符串属性

1 个答案:

答案 0 :(得分:0)

您应该指定更具体的类型,而不是T。即T extends Record<string, string>

const action = (param: string) => {
    return param;
};

interface Relation<T extends Record<string, string>, K extends keyof T> {
    store: T;
    storeKey: K;
}

const testFunction = <T extends Record<string, string>, K extends keyof T>({ store, storeKey }: Relation<T, K>) => {
    action(store[storeKey]);
};