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

时间:2017-09-21 14:15:04

标签: typescript typescript2.0

我想实现一个函数pluck,它返回key:value对象

function pluck<T>(source:T,key:keyof T):Record<typeof key , T[typeof key]>{
    return {[key]:source[key]}
}

但返回的类型包含传递source的所有键,而不仅仅是key类型定义。

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的主要问题是key的类型全部是keyof T,它应该是扩展的通用类型 keyof T所以它可以是推断为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*
} 

希望有所帮助;祝你好运!

*请注意,您需要断言返回值的类型,因为TypeScript bug(尽管已关闭)可能无法完全解析。