根据传递的字符串参数约束返回的对象属性
Constraining returned object properties based on passed string parameter
我想实现一个函数 pluck
其中 returns key:value
对象
function pluck<T>(source:T,key:keyof T):Record<typeof key , T[typeof key]>{
return {[key]:source[key]}
}
但返回的类型包含传递的所有键 source
而不仅仅是类型定义上的 key
。
如何解决这个问题?
你的主要问题是 key
的类型是 keyof T
的所有类型,它应该是 扩展 [=13= 的泛型类型] 所以可以推断为keyof T
中的一个键。这意味着:
function pluck<T, K extends keyof T>(source: T, key: K): Record<K, T[K]> {
return { [key]: source[key] } as Record<K, T[K]>; // see footnote*
}
这应该适合你。请注意,类型 Record<K, T[K]>
可以更简洁地写为 Pick<T, K>
:
function pluck<T, K extends keyof T>(source: T, key: K): Pick<T,K> {
return { [key]: source[key] } as Pick<T,K>; // see footnote*
}
希望对您有所帮助;祝你好运!
* 请注意,您需要断言 return 值的类型,因为 TypeScript bug(尽管已关闭)可能无法完全解析。
我想实现一个函数 pluck
其中 returns key:value
对象
function pluck<T>(source:T,key:keyof T):Record<typeof key , T[typeof key]>{
return {[key]:source[key]}
}
但返回的类型包含传递的所有键 source
而不仅仅是类型定义上的 key
。
如何解决这个问题?
你的主要问题是 key
的类型是 keyof T
的所有类型,它应该是 扩展 [=13= 的泛型类型] 所以可以推断为keyof T
中的一个键。这意味着:
function pluck<T, K extends keyof T>(source: T, key: K): Record<K, T[K]> {
return { [key]: source[key] } as Record<K, T[K]>; // see footnote*
}
这应该适合你。请注意,类型 Record<K, T[K]>
可以更简洁地写为 Pick<T, K>
:
function pluck<T, K extends keyof T>(source: T, key: K): Pick<T,K> {
return { [key]: source[key] } as Pick<T,K>; // see footnote*
}
希望对您有所帮助;祝你好运!
* 请注意,您需要断言 return 值的类型,因为 TypeScript bug(尽管已关闭)可能无法完全解析。