是否可以在不明确说明每个数字的情况下生成数字的联合类型?

2024-02-26

假设我想生成一个按比例递增的数字的联合类型,但联合中的条目数量将非常大,我可以在不显式键入联合中的每个类型的情况下生成它吗?

说我有type ScaleByEight = 8 | 16 | 24 | 32 ... 400;

我可以创建一个实用程序,可以在其中传递最小值、最大值和要缩放的值吗?

就像是type ScaleByEight = ScaleBy</* min */ 8, /* max */, 400, /* scale by */ 8>;


这是可能的,但是我不会在 PROD 代码上过多依赖此逻辑:

type MAXIMUM_ALLOWED_BOUNDARY = 999

type ComputeRange<
    N extends number,
    Result extends Array<unknown> = [],
> =
    (Result['length'] extends N
        ? Result
        : ComputeRange<N, [...Result, Result['length']]>
    )

type Add<A extends number, B extends number> = [...ComputeRange<A>, ...ComputeRange<B>]['length']

type IsGreater<A extends number, B extends number> = IsLiteralNumber<[...ComputeRange<B>][Last<[...ComputeRange<A>]>]> extends true ? false : true

type Last<T extends any[]> = T extends [...infer _, infer Last] ? Last extends number ? Last : never : never

type RemoveLast<T extends any[]> = T extends [...infer Rest, infer _] ? Rest : never

type IsLiteralNumber<N> = N extends number ? number extends N ? false : true : false


type AddIteration<Min extends number, Max extends number, ScaleBy extends number, Result extends Array<unknown> = [Min]> =
    IsGreater<Last<Result>, Max> extends true
    ? RemoveLast<Result>
    : AddIteration<
        Min, Max, ScaleBy, [...Result, Add<Last<Result>, ScaleBy>]
    >

// [5, 13, 21, 29, 37]
type Result = AddIteration<5, 40, 8>

操场 https://tsplay.dev/w6L7Gm

请看我的answer https://stackoverflow.com/questions/69089549/typescript-template-literal-type-how-to-infer-numeric-type#answer-69090186 and article https://catchts.com/range-numbers

解释ComputeRange你可以找到this https://stackoverflow.com/questions/69089549/typescript-template-literal-type-how-to-infer-numeric-type#answer-69090186回答和我的文章 https://catchts.com/range-numbers

Add- 只是连接两个数组并返回新的长度。就像 :

const add=(xl:number[], yl:number[]) => [...xl,...yl].length

IsLiteralNumbe- 检查提供的数字是否是字面数字,例如2 or 42或者只是一般类型number.

Last返回数组的最后一个元素

IsGreater检查最后一个元素是否ComputeRange<A>可以用作索引ComputeRangeB。请记住,中的所有元素ComputedRange也是索引。

AddIteration- 是一种递归实用程序类型,它检查 Result 的最后一个元素是否大于 Max。如果是 - 返回没有最后一个元素的结果,否则,通过加法递归调用自身。

在这里你可以测试js表示。我尽可能地接近,但并不是所有的事情都能表达出来。

const add = (a: number, b: number) => [...computeRange(a), ...computeRange(b)]['length']

const isLiteralNumber = (value: any) => typeof value === 'number'

const last = (xl: number[]) => {
    //const [...rest, last] = xl
    return xl[xl.length - 1]
}

const computeRange = (n: number) => Array(n).fill(0).map((_, index) => index)

const isGreater = (a: number, b: number) => isLiteralNumber([...computeRange(b)][last(computeRange(a))]) ? false : true

const addIteration = (min: number, max: number, scaleBy: number, result = [min]): number[] => {
    if (isGreater(last(result), max)) {
        return result
    }

    return addIteration(min, max, scaleBy, [...result, add(last(result), scaleBy)])
}
const result = addIteration(5, 40, 8)

// [ 5, 13, 21, 29, 37, 45 ]
console.log({ result })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在不明确说明每个数字的情况下生成数字的联合类型? 的相关文章

随机推荐

  • 汇编代码不识别?和@数据

    这是我的第一个汇编程序 任何人都可以帮助使其成功运行 我看到下面的编译错误 为什么它不识别 and data 我正在尝试交换汇编中的两个变量 我正在执行以下命令 nasm f elf swap asm 但我收到这个错误 swap asm 6
  • WebLogic 10gR3 - 解析多部分/表单数据的 Content-Type 标头时出现 UnsupportedEncodingException

    我的应用程序在 WebLogic 10gR3 上通过 HTTP POST 接收多部分内容 每当客户指定charset属性beforeContent Type 标头上的其他属性 例如Content Type multipart form da
  • 乘以 keyup 上的输入值

    如何将一个输入的值乘以 2 并将其保存到另一个输入 那么当我输入 10 例如 时 第二个输入的值将是 20 Thanks 两个输入字段
  • 强制溢出到顶部而不是底部

    我希望我的内容溢出到 div 的顶部和左侧而不是右下角 目的是当展开 div 时 内容看起来像是从顶部而不是从底部进入 CSS 有什么办法可以做到这一点吗 很像你设置的方式vertical align对于文本 我想让 div 溢出到顶部而不
  • 将父容器的平移手势交给嵌套的 UICollectionView

    我正在尝试构建一个复杂的分割视图容器控制器 该控制器有利于两个可变高度容器 每个容器都有自己的嵌套视图控制器 父控制器上有一个全局平移手势 允许用户拖动视图容器中的任意位置 并在视图之间上下滑动 分隔线 它还具有一些智能位置阈值检测逻辑 可
  • 如何为 Cosmos 数据库中的每个文档设置字段?

    将每条记录的 PumperID 字段设置为默认值的 Cosmos 存储过程会是什么样子 我们需要这样做来修复一些数据 因此该过程将访问具有 PumperID 字段的每条记录 并非所有文档都有此字段 并将其设置为默认值 假设执行一次性数据维护
  • Biztalk Log4Net [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人在 Biztalk 中使用过 log4net 吗 我们目前正在考虑使用它 并试图了解它的优点 缺点 以及它是否能满足我们的需求 我已经将 L
  • Tomcat:限制 /just one/ webapp 对 localhost 的访问

    我正在运行 Tomcat 6 来为多个 Web 应用程序提供服务 其中大多数是面向公众的 但我想限制访问just onewebapp 仅允许来自本地主机的连接 我可以限制访问allwebapps 在 context xml 中使用 Valv
  • Java 7 独立应用程序中的依赖注入

    我想在大型 Java 7 独立应用程序中使用依赖注入 但我不太确定从哪里开始 我写了一个小测试应用程序 public class Main Inject MyInterface myInterface public static void
  • 如何验证PDF表单?

    我有一个用 Acrobat Professional 制作的可写 PDF 表单 我想验证数字条目是否在特定范围 a b 内 如果不是 我希望弹出一条警报 其中包含以下消息 请通过 XXX XXX XXXX 联系 Larry 以处理您的表单
  • Redis 连接因关闭事件而消失

    在我们的redis配置中 我们设置了超时 7秒 In 节点redis https github com mranney node redis我们将 Redis 连接就绪和结束事件处理为 client on ready function lo
  • CLion 无法从剪贴板粘贴正确的代码片段

    虽然在我的编程 职业生涯 中大部分时间都使用 Java 和 PHP 但我现在正在尝试更深入地学习 C 为此 我使用 CLion 作为我的 IDE 主要是因为我非常熟悉 phpStorm 和 IntelliJ IDEA 除了学习一门新语言之外
  • 有效识别字符串的一部分是否在列表/字典键中? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我的列表中有很多 gt 100 000 小写字符串 其中子集可能如下所示 str list hello i am fro
  • 将Drawable转换为BLOB数据类型sqlite问题

    在这里 我附加了将图像存储在 Drawable 中并以 BLOB 数据类型传递到数据库的代码 我尝试了这个 它可以正确存储但不显示图像 Insall app db i1 new Insall app db i1 createDatabse
  • 匹配多列中的值的函数

    使用以下测试数据 df2 pd DataFrame np random randn 12 3 columns A B C thresh 3 df2 matches np where df2 A df2 B lt thresh 1 0 我创建
  • 为什么ContentObserver被多次调用?

    我有以下ContentObserver接收和写入短信的实现 但被多次调用 Code public class SMSObserverActivity extends Activity protected MyContentObserver
  • 如何在 SQL 中汇总从子级到父级的树状结构中的数据?

    我有一个查询 要求在树状结构中选择每个部门的金额 我想显示孩子们各自父母的总金额 是否可以在不使用游标的情况下将其存档在查询中 以下是要总结的数据结果集 完整的示例也可以在sqlfiddle http sqlfiddle com 4 ea0
  • 如何在 Windows Phone 应用程序中以编程方式更改堆栈面板的背景颜色?

    我只想设置背景属性堆栈面板 目前我通过以下代码设置它 statusPanel Background new SolidColorBrush Colors Cyan 但我只想设置一个十六进制值 我该怎么做 statusPanel Backgr
  • 使用 python ruamel.yaml 将内容添加到 yaml 文件时从 dict 值中删除单引号

    我有一个 yaml 文件 如下所述 test1 yaml resources name get param vname ssh keypair get param ssh keypair 现在我想在 test1 yaml 的资源下添加 te
  • 是否可以在不明确说明每个数字的情况下生成数字的联合类型?

    假设我想生成一个按比例递增的数字的联合类型 但联合中的条目数量将非常大 我可以在不显式键入联合中的每个类型的情况下生成它吗 说我有type ScaleByEight 8 16 24 32 400 我可以创建一个实用程序 可以在其中传递最小值