【问题标题】:Require a Specific Item in a TypeScript Array需要 TypeScript 数组中的特定项目
【发布时间】:2021-07-16 18:02:05
【问题描述】:

我如何为 typescript 数组中的特定项目编写需求?例如,让我们考虑“至少有一个数字七的数字数组”。似乎要求特定元素为 7 很容易,但要求“其中一个元素”更难。

我尝试了以下方法。但是,它会产生Type alias 'ContainsSeven' circularly references itself. ts(2456) 错误。

type ContainsSeven =
  |[7, ...Array<number>]
  |[number, ...ContainsSeven]

const example1: ContainsSeven = [1,2,7]
const example2: ContainsSeven = [1,7,2]
const example3: ContainsSeven = [7,1,2]
    
// @ts-expect-error
const counter1: ContainsSeven = []
// @ts-expect-error
const counter2: ContainsSeven = [1,2,3]

我的最终目标是使用标准 JavaScript 数组而不是自定义链接结构来实现生成器的惰性连接。有关更全面的示例,请参阅 related diff

【问题讨论】:

标签: typescript


【解决方案1】:

这是可行的,但有函数助手:

type IsValid<T extends number[]> = 7 extends T[number] ? T : never

const withSeven = <T extends number, List extends T[]>(list: IsValid<[...List]>) => list

withSeven([1, 2, 3, 4, 5, 7]) // ok

withSeven([1, 2, 3, 4, 5]) // error

IsValid 检查数组元素之一是否为 7。如果是 7 - 返回数组,否则 - 返回 never

您可以在我的herehere 中找到有关类型验证的更多信息

关于 circularly references,我敢打赌this 问题/答案与您的问题有关

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-02
    • 2014-06-18
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 2016-08-21
    相关资源
    最近更新 更多