typescript - 在通用函数输入中强制执行键类型
问题描述
假设我有通用功能:
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
解决方案
要将属性名称限制为仅具有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"'.