根据传递的字符串参数约束返回的对象属性

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(尽管已关闭)可能无法完全解析。