只允许字段为字符串的键的打字稿类型
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
".
看着我挥挥手,让我看起来知道我在说什么!
我看过类似的问题,但他们离我需要的还差一步。
例如,当我尝试在函数中使用它时,
我需要的是一个函数,它接受项目 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
".
看着我挥挥手,让我看起来知道我在说什么!