打字稿:增量数字类型

Typescript: increment number type

是否可以从数字类型 T 得到值为 T+1 的数字类型 Y

type one = 1

type Increment<T extends number> = ???

type two = Increment<one> // 2

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

export type IncrementMap = {
    0: 1,
    1: 2,
    2: 3,

我会像这样硬编码:

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)我会有兴趣看到它。也许将来有一天它会成为语言的一部分。

希望对您有所帮助;祝你好运!

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

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>>;