typescript - typescript 中独立泛型类型的数组

标签 typescript

我正在尝试编写一个函数,它将采用一组初始化函数及其选项。我能够从函数中导出选项的类型,因此我认为我应该能够检查我提供的选项是否属于同一类型。

该示例是此示例的最小化版本。我认为每个数组项都需要一个独立的泛型,但我显然不知道数组的大小。

type O<T> = { a: T }
type E<T> = [O<T>, T]

const f = <T={}>(array: E<T>[]) => {}

f([
  [{ a: 4 }, 4],     //Works
  [{ a: "5" }, "5"]   //Doesn't work as T is set to number
])

最佳答案

解决方案:

type O = { a: any }

type E<T extends O[]> = {
   [P in keyof T]: T[P] extends T[number] ? [T[P], T[P]["a"]] : never;
}  

const f = <T extends O[]>(...args: E<T>) => { }  

或者更笼统地说:

type E<T extends {}[], K extends keyof T[number]> = {
   [P in keyof T]: T[P] extends T[number] ? [T[P], T[P][K]] : never;
}

const f = <T extends O[]>(...args: E<T, "a">) => { }

应该注意的是,如果不使用 rest 参数,我无法让它工作。

说明:

一旦我不再过多地关注每个元素的单个泛型,使用映射类型我设法做到了:

type E<T extends { a: any }[]> = {
   [P in keyof T]:  [T[P], T[P]["a"]]
}

但出现错误:类型“a”不能用于索引类型“T[P]”。

事实证明这是因为将 keyof 与元组一起使用包括非数字键(例如“长度”)。我在 Typescript Github issue 上找到了解决方案;只检查数字键。

关于typescript - typescript 中独立泛型类型的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54502852/

相关文章:

javascript - 表格行折叠?

javascript - 如何在 Typescript 中为 webpack.config.ts 创建一个 switch case?

angular - 在使用 Primeng 的 FileUpload 组件上传之前添加自定义 header

angular - typescript 枚举值作为数组参数

angular - 在 Angular 8 项目中使用对象哈希会导致 "Cannot read property ' crypto' of undefined”错误

对象属性路径的 TypeScript 类型定义

typescript 在静态方法中获取类型

javascript - 在 React 中调用组件时访问 props 时遇到问题

javascript - Typescript 错误 : Map. values() 给出 IterableIterator not Iterable

typescript - Material-ui@next 带有 typescript d.ts 文件