如何在打字稿中键入通用合并功能

布德温

我有一个通用的javascript函数,无法在打字稿中正确键入。它需要一组项目。如果这些项目是数组,则将它们展平为单个数组。如果它们是对象,它将它们合并为一个大对象。否则,它仅返回原始数组。

function combineResults(responses) {
  if (responses.length === 0) {
    return [];
  }

  if (Array.isArray(responses[0])) {
    return responses.flat(1);
  } else if (typeof responses[0] === 'object') {
    return Object.assign({}, ...responses);
  }
  else {
    return responses;
  }
}

是否可以安全地键入此值,以便如果您传递数组数组,则返回类型将是一个数组,如果您传递对象数组,则返回类型将是一个对象。而且,如果您既不传递数组也不传递对象,则返回类型将是原始数组类型。

贾卡尔兹

我倾向于为每种情况提供一个重载的类型签名。这里有一些障碍:一个是您只检查的第一个元素,responses并假设其余元素属于同一类型;但是数组可以是异构的。而且由于JS和TS中的数组被认为是对象,所以combineResults()如果您给它一个异构数组(如),则的调用签名可能会做一些奇怪的事情[[1, 2, 3], {a: 1}]我不知道您想在运行时在那里发生什么,所以我不知道您想在类型签名中发生什么。这些是极端情况。

另一个障碍是,[{a: 1}, {b: ""}]在TypeScript中将like这样的数组视为type Array<{a: number, b?: undefined} | {b: string, a?: undefined}>,并将其转换为{a: number, b: string}涉及很多类型系统的循环跳跃,包括将并集转换为交集并滤除undefined属性。

因此,这里是:

type UnionToIntersection<U> =
  (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never
type Defined<T> = T extends any ? Pick<T, { [K in keyof T]-?: T[K] extends undefined ? never : K }[keyof T]> : never;
type Expand<T> = T extends infer U ? { [K in keyof U]: U[K] } : never;

function combineResults<T extends ReadonlyArray<any>>(responses: ReadonlyArray<T>): T[number][];
function combineResults<T extends object>(responses: ReadonlyArray<T>): Expand<UnionToIntersection<Defined<T>>>;
function combineResults<T extends ReadonlyArray<any>>(responses: T): T;
function combineResults(responses: readonly any[]) {
  if (responses.length === 0) {
    return [];
  }
  if (Array.isArray(responses[0])) {
    return responses.flat(1);
  } else if (typeof responses[0] === 'object') {
    return Object.assign({}, ...responses);
  }
  else {
    return responses;
  }
}

呼叫签名应将数组数组映射到数组,将对象数组映射到对象,并将任何其他数组映射到自身。让我们测试一下:

const arrs = combineResults([[1, 2, 3], ["a", "b"]]); // (string | number)[]
const objs = combineResults([{ a: 1 }, { b: "hey" }]) // {a: number, b: string}
const nons = combineResults([1, 2, 3]); // number[]

我认为看起来不错。但是要注意边缘情况:

const hmm = combineResults([[1, 2, 3], { a: "" }])
/* const hmm: {
    [x: number]: number;
    a: string;
} ?!?!? */

您可能需要调整这些签名以完全防止异类数组。但这是我现在没有时间继续下去的另一个漏洞。

好的,希望能有所帮助;祝好运!

操场上的代码链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在打字稿中键入部分应用的函数?

来自分类Dev

如何在打字稿中键入以下对象/类型

来自分类Dev

如何在打字稿中键入对象键?

来自分类Dev

lodash流函数应如何在打字稿中键入?

来自分类Dev

如何在打字稿中键入以防止返回值

来自分类Dev

如何在打字稿中的对象文字中键入带有“ this”的方法?

来自分类Dev

在打字稿中键入交集

来自分类Dev

如何在打字稿中使用不同类型的通用键键入对象

来自分类Dev

使用接口在打字稿中键入匿名对象

来自分类Dev

将类用作变量并在打字稿中键入

来自分类Dev

如何在打字稿中定义匿名通用接口?

来自分类Dev

如何在打字稿中定义通用接口

来自分类Dev

如何在打字稿中定义匿名通用接口?

来自分类Dev

如何在打字稿中使用Nullish合并

来自分类Dev

如何在打字稿中实现同步功能(Angular)

来自分类Dev

我如何在打字稿中的嵌套for ... in循环中正确键入索引签名?

来自分类Dev

在打字稿中键入时使用变量字符串

来自分类Dev

如何在打字稿中使用通用类型和联合类型

来自分类Dev

如何在TS中键入功能签名?

来自分类Dev

如何在打字稿中动态合并两个数组对象?

来自分类Dev

如何在打字稿中动态合并两个数组对象?

来自分类Dev

我如何在打字稿中合并来自不同文件的不同快递路线

来自分类Dev

如何在打字稿中检索功能签名列表?

来自分类Dev

Firebase:如何在打字稿/云功能中创建或访问地图

来自分类Dev

在打字稿中,如何从“ lodash / merge”导入合并

来自分类Dev

在打字稿中,如何定义异步功能的类型

来自分类Dev

键入通用打字稿结构的问题

来自分类Dev

如何在打字稿中使用JavaScript

来自分类Dev

如何在打字稿中包含原型

Related 相关文章

  1. 1

    如何在打字稿中键入部分应用的函数?

  2. 2

    如何在打字稿中键入以下对象/类型

  3. 3

    如何在打字稿中键入对象键?

  4. 4

    lodash流函数应如何在打字稿中键入?

  5. 5

    如何在打字稿中键入以防止返回值

  6. 6

    如何在打字稿中的对象文字中键入带有“ this”的方法?

  7. 7

    在打字稿中键入交集

  8. 8

    如何在打字稿中使用不同类型的通用键键入对象

  9. 9

    使用接口在打字稿中键入匿名对象

  10. 10

    将类用作变量并在打字稿中键入

  11. 11

    如何在打字稿中定义匿名通用接口?

  12. 12

    如何在打字稿中定义通用接口

  13. 13

    如何在打字稿中定义匿名通用接口?

  14. 14

    如何在打字稿中使用Nullish合并

  15. 15

    如何在打字稿中实现同步功能(Angular)

  16. 16

    我如何在打字稿中的嵌套for ... in循环中正确键入索引签名?

  17. 17

    在打字稿中键入时使用变量字符串

  18. 18

    如何在打字稿中使用通用类型和联合类型

  19. 19

    如何在TS中键入功能签名?

  20. 20

    如何在打字稿中动态合并两个数组对象?

  21. 21

    如何在打字稿中动态合并两个数组对象?

  22. 22

    我如何在打字稿中合并来自不同文件的不同快递路线

  23. 23

    如何在打字稿中检索功能签名列表?

  24. 24

    Firebase:如何在打字稿/云功能中创建或访问地图

  25. 25

    在打字稿中,如何从“ lodash / merge”导入合并

  26. 26

    在打字稿中,如何定义异步功能的类型

  27. 27

    键入通用打字稿结构的问题

  28. 28

    如何在打字稿中使用JavaScript

  29. 29

    如何在打字稿中包含原型

热门标签

归档