代码之家  ›  专栏  ›  技术社区  ›  Nurbol Alpysbayev

Typescript:递增数字类型

  •  2
  • Nurbol Alpysbayev  · 技术社区  · 6 年前

    从数字类型可以吗 T 获取数字类型 Y

    type one = 1
    
    type Increment<T extends number> = ???
    
    type two = Increment<one> // 2
    

    注意:目前,我有递增值的硬编码接口,但问题是硬编码的,因此受到限制:

    export type IncrementMap = {
        0: 1,
        1: 2,
        2: 3,
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   jcalz    6 年前

    我只想硬编码如下:

    type Increment<N extends number> = [
      1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
      21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,
      38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54, // as far as you need
      ...number[] // bail out with number
    ][N]
    
    type Zero = 0
    type One = Increment<Zero> // 1
    type Two = Increment<One>  // 2
    
    type WhoKnows = Increment<12345>; // number
    

    正如我在其他评论中所说,目前还没有对这种自然递归类型的强大支持。我 would love it 如果它被支持,但它不在那里。在实践中,我发现,如果某个东西可以处理长度为20左右的元组,这就足够了,但您的体验可能会有所不同。

    Increment<123456789> 将评估为 123456790 )我很想看看。也许将来有一天它会成为语言的一部分。

        2
  •  0
  •   Holp    3 年前

    此解决方案不是硬编码的,但由于TypeScript的递归限制,它没有用处。当我测试它时,它无法处理 Number2Nat

    type SomeNat = [...unknown[]];
    type Zero = [];
    type Succ<N extends SomeNat> = [...N, unknown];
    type Nat2Number<N extends SomeNat> = N["length"];
    type Dec<N extends SomeNat> = N extends [unknown, ...infer T] ? T : never;
    type Add<N extends SomeNat, M extends SomeNat> = [...N, ...M];
    type Sub<N extends SomeNat, M extends SomeNat> = M extends Zero ? N : Sub<Dec<N>, Dec<M>>;
    type Number2Nat<I extends number, N extends SomeNat = Zero> = I extends Nat2Number<N> ? N : Number2Nat<I, Succ<N>>;