【问题标题】:Array of independent generic types in typescript打字稿中的独立泛型类型数组
【发布时间】:2019-02-09 23:41:07
【问题描述】:

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

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

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
])

【问题讨论】:

标签: typescript


【解决方案1】:

解决办法:

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 上找到了解决方案;只检查数字键。

【讨论】:

    猜你喜欢
    • 2020-02-05
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 2022-01-04
    • 2019-12-21
    相关资源
    最近更新 更多