ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Typescirpt】定义数字范围类型

2021-11-26 18:00:34  阅读:167  来源: 互联网

标签:定义 ConcatLargestUntilDone Typescirpt never extends 范围 type BuildPowersOf2LengthA


数字范围参数

有的时候我们想定义一个参数的数字范围,如果范围比较小点好,比如1到5。

type Range = 1 | 2 | 3 | 4 | 5 ;

但如果数字范围很大,比如 1到100,或是1到1000,那就要写死了。

支持现状

Github上有人提了相关的建议,但还处于Open状态
https://github.com/microsoft/TypeScript/issues/15480

现实

从网上找抄了一个别的人实现的(Playground):

type BuildPowersOf2LengthArrays<N extends number, R extends never[][]> =
  R[0][N] extends never ? R : BuildPowersOf2LengthArrays<N, [[...R[0], ...R[0]], ...R]>;

type ConcatLargestUntilDone<N extends number, R extends never[][], B extends never[]> =
  B["length"] extends N ? B : [...R[0], ...B][N] extends never
    ? ConcatLargestUntilDone<N, R extends [R[0], ...infer U] ? U extends never[][] ? U : never : never, B>
    : ConcatLargestUntilDone<N, R extends [R[0], ...infer U] ? U extends never[][] ? U : never : never, [...R[0], ...B]>;

type Replace<R extends any[], T> = { [K in keyof R]: T }

type TupleOf<T, N extends number> = number extends N ? T[] : {
  [K in N]: 
  BuildPowersOf2LengthArrays<K, [[never]]> extends infer U ? U extends never[][]
  ? Replace<ConcatLargestUntilDone<K, U, []>, T> : never : never;
}[N]

type RangeOf<N extends number> = Partial<TupleOf<unknown, N>>["length"];

type RangeOf2<From extends number, To extends number> = Exclude<RangeOf<To>, RangeOf<From>> | From;

type X = RangeOf2<1,100>

标签:定义,ConcatLargestUntilDone,Typescirpt,never,extends,范围,type,BuildPowersOf2LengthA
来源: https://www.cnblogs.com/gaoshang212/p/15604274.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有