某些实用程序功能的通用类型

时间:2019-11-09 13:48:17

标签: javascript typescript functional-programming javascript-objects

我有一些实用工具功能,想在打字稿中添加泛型类型,但不知道该怎么做。

(这些基于ramda的功能,但是我不想在该项目中使用ramda。)

选择:

function pick(keys, object) {
  const result = Object.assign(
    {},
    ...keys.map(k => (k in object ? { [k]: object[k] } : {}))
  );
  return result;
}

拒绝:

function reject(keys, object) {
  const result = Object.assign(
    {},
    ...Object.keys(object)
      .filter(k => !keys.includes(k))
      .map(k => ({ [k]: object[k] }))
  );
  return result;
}
}

...我想像这样使用它们,并让打字稿算出结果类型:


type Item = {title: string, description: string}

const test: { [key: string]: Item } = {
  a: { title: 'TitleA', description: 'DescriptionA' },
  b: { title: 'TitleB', description: 'DescriptionB' },
  c: { title: 'TitleC', description: 'DescriptionC' },
  d: { title: 'TitleD', description: 'DescriptionD' }
};

const test1 = pick(['a', 'c'], test) // {a: { title: 'TitleA', description: 'DescriptionA' }, c: { title: 'TitleC', description: 'DescriptionC' }}
const test2 = reject(['a', 'c'], test) // {b: { title: 'TitleB', description: 'DescriptionB' },d: { title: 'TitleD', description: 'DescriptionD' }}
  

有人建议如何向这些pickreject函数添加通用类型吗?

1 个答案:

答案 0 :(得分:2)

您可以使用两个通用类型参数,一个用于对象本身,一个用于选取的键。然后,您可以将类型边界添加到键中,成为对象键的子集。然后,返回类型是在对象上查找的键的映射类型:

 function pick<O, K extends keyof O>(keys: K[], object: O): { [T in K]: O[T] }

可以类似地键入reject函数:

 function reject<O, K extends keyof O>(keys: K[], object: O): { [T in keyof O]: T extends K ? undefined : O[T] }