在通用函数输入中强制执行键的类型

Tom*_*rKr 4 generics typescript

假设我有通用函数:

function f<T, K extends keyof T>(obj: T, key: K) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

如果不把东西扔到 ,这完全可能any吗?

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

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

Ale*_* L. 6

要将属性名称限制为仅具有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"'.
Run Code Online (Sandbox Code Playgroud)

操场

  • 2.5 年后突然出现,谢谢你让我避免了很多挫败感! (2认同)