首页 > 解决方案 > 在通用函数输入中强制执行键类型

问题描述

假设我有通用功能:

function f<T, K extends keyof T>(obj: T, key: K) {
   ...
}

我想强制执行类型,T[K]以便我可以执行类型特定的操作。例如,使用字符串:

function f<T, K extends keyof T>(obj: T, key: K): string {
    return obj[key].toLowerCase();
}

如果不将东西投射到,这是否可能any

编辑: 为了澄清,我正在寻找基于结果类型禁止某些键的能力。使用上面的示例,类似于:

f({a: 123, b: 'abc'}, 'b') //No errors
f({a: 123, b: 'abc'}, 'a') //Typescript error, T['a'] is not string

标签: typescriptgenerics

解决方案


要将属性名称限制为仅具有string值类型的属性名称,您可以将条件类型与映射类型结合使用:

type StringProperties<T> = { [K in keyof T]: T[K] extends string ? K : never }[keyof T];

declare function f<T>(obj: T, key: StringProperties<T>): string;

f({a: 123, b: 'abc'}, 'b') // No errors
f({a: 123, b: 'abc'}, 'a') // Error: Argument of type '"a"' is not assignable to parameter of type '"b"'.

操场


推荐阅读