打字稿:增量数字类型
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>>;
是否可以从数字类型 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>>;