只允许字段为字符串的键的打字稿类型

Typescript type that only allows keys whose fields are strings

我看过类似的问题,但他们离我需要的还差一步。 例如,当我尝试在函数中使用它时, 的解决方案不起作用: Playground

我需要的是一个函数,它接受项目 T 和 T 的一个键,这样编译器就知道该键总是引用一个字符串字段,因此 return 类型的项目[key]是字符串:

function f2<T> (item: T, key: StringOnlyKeys<T>): string {
    return item[key] as string;
}

这在一般情况下无法编译,请参阅 playground link

这看起来可行:

function f2<T extends Record<any, any>>(item: T, key: StringOnlyKeys<T>): string {
    return item[key];
}

我不是 100% 确定为什么,但我的猜测是 TypeScript 不会隐式限制泛型类型参数。所以,如果你使用不受限制的 <T>,那可能是 number(例如),而不是说 "啊,那意味着这个函数不可能被调用使用 number",编译器会说 "我不知道 StringOnlyKeys<number> 是什么意思,所以任何涉及它的东西都必须是 any".

看着我挥挥手,让我看起来知道我在说什么!