• 【Typescirpt】定义数字范围类型


    数字范围参数

    有的时候我们想定义一个参数的数字范围,如果范围比较小点好,比如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>
    
    
    本文原创手打,转载请注明出处。 Electron 交流 QQ:160162552
  • 相关阅读:
    GTD时间管理(1)---捕获搜集
    ios面试总结-
    Swift入门篇-结构体
    Swift入门篇-闭包和函数
    swift入门篇-函数
    Swift入门篇-集合
    Swift入门篇-循环语句
    Swift入门篇-基本类型(3)
    Swift入门篇-基本类型(2)
    Swift入门篇-基本类型(1)
  • 原文地址:https://www.cnblogs.com/gaoshang212/p/15604274.html
Copyright © 2020-2023  润新知