type-plus 4.6.0 → 4.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,2 @@
1
- import { IsPositive } from '../math';
2
- declare type BuildPowersOf2LengthArrays<N extends number, R extends never[][]> = R[0][N] extends never ? R : BuildPowersOf2LengthArrays<N, [[...R[0], ...R[0]], ...R]>;
3
- declare 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]>;
4
- declare type Replace<R extends any[], T> = {
5
- [K in keyof R]: T;
6
- };
7
- export declare type CreateTuple<L extends number, T = any> = number extends L ? T[] : IsPositive<L> extends true ? {
8
- [K in L]: BuildPowersOf2LengthArrays<K, [[never]]> extends infer U ? (U extends never[][] ? Replace<ConcatLargestUntilDone<K, U, []>, T> : never) : never;
9
- }[L] : never;
10
- export {};
1
+ import { DigitArray, IsPositive } from '../math';
2
+ export declare type CreateTuple<L extends number, T = any> = number extends L ? T[] : IsPositive<L> extends true ? DigitArray.ToTuple<[], DigitArray.FromNumber<L>, T> : never;
@@ -45,7 +45,7 @@ export declare namespace Digit {
45
45
  }
46
46
  export declare namespace DigitArray {
47
47
  type ToNumber<C extends number[]> = ToTuple<[], C>['length'];
48
- type ToTuple<R extends any[], S extends number[]> = S['length'] extends 0 ? R : (S['length'] extends 1 ? [...R, ...Digit.ToTuple[S[0]]] : (S extends [any, ...infer T] ? (T extends any[] ? ToTuple<Multi10<[...R, ...Digit.ToTuple[S[0]]]>, T> : never) : never));
48
+ type ToTuple<R extends any[], S extends number[], X = any> = S['length'] extends 0 ? R : (S['length'] extends 1 ? [...R, ...Digit.ToTuple<X>[S[0]]] : (S extends [any, ...infer T] ? (T extends any[] ? ToTuple<Multi10<[...R, ...Digit.ToTuple<X>[S[0]]]>, T> : never) : never));
49
49
  type Multi10<C extends any[]> = [...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C, ...C];
50
50
  type FromNumber<N extends number> = FromString<NumberToString<N>>;
51
51
  type NumberToString<N extends number> = (And<IsPositive<N>, IsWhole<N>>) extends true ? `${N}` : never;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "4.6.0",
3
+ "version": "4.6.1",
4
4
  "description": "Provides additional types for TypeScript.",
5
5
  "homepage": "https://github.com/unional/type-plus",
6
6
  "bugs": {
@@ -9,11 +9,13 @@ test('single element', () => {
9
9
  })
10
10
 
11
11
  test('multiple elements', () => {
12
- isType.equal<true, [any, any, any], CreateTuple<3>>()
12
+ type A = CreateTuple<3>
13
+ isType.equal<true, [any, any, any], A>()
13
14
  })
14
15
 
15
16
  test('override element type', () => {
16
- isType.equal<true, [1, 1, 1, 1, 1], CreateTuple<5, 1>>()
17
+ type A = CreateTuple<5, 1>
18
+ isType.equal<true, [1, 1, 1, 1, 1], A>()
17
19
  })
18
20
 
19
21
  test('negative length gets never', () => {
@@ -1,35 +1,12 @@
1
- import {
2
- // Digit,
3
- IsPositive
4
- } from '../math'
5
-
6
- // export type CreateTuple<L extends number, T = any> =
7
- // number extends L ? T[] : IsPositive<L> extends true
8
- // ? [...Digit.ToTuple<T>[L]]
9
- // : never
10
-
11
- type BuildPowersOf2LengthArrays<N extends number, R extends never[][]> =
12
- R[0][N] extends never ? R : BuildPowersOf2LengthArrays<N, [[...R[0], ...R[0]], ...R]>
13
-
14
- type ConcatLargestUntilDone<N extends number, R extends never[][], B extends never[]> =
15
- B['length'] extends N ? B : [...R[0], ...B][N] extends never
16
- ? ConcatLargestUntilDone<N, R extends [R[0], ...infer U] ? U extends never[][] ? U : never : never, B>
17
- : ConcatLargestUntilDone<N, R extends [R[0], ...infer U] ? U extends never[][] ? U : never : never, [...R[0], ...B]>
18
-
19
- type Replace<R extends any[], T> = { [K in keyof R]: T }
1
+ import { DigitArray, IsPositive } from '../math'
20
2
 
21
3
  /**
22
4
  * Creates `Tuple<T>` with `L` number of elements.
23
- * @note The original implementation hits recursive limit.
24
- * Updated implementation based on below by @lazytype
5
+ * @note Other cool implementations by @lazytype, @jcalz:
25
6
  * @see https://github.com/microsoft/TypeScript/issues/26223#issuecomment-674514787
26
7
  * @see https://github.com/microsoft/TypeScript/issues/47874#issuecomment-1039157322
27
8
  */
28
9
  export type CreateTuple<L extends number, T = any> =
29
10
  number extends L ? T[] : IsPositive<L> extends true
30
- ? {
31
- [K in L]: BuildPowersOf2LengthArrays<K, [[never]]> extends infer U
32
- ? (U extends never[][] ? Replace<ConcatLargestUntilDone<K, U, []>, T> : never)
33
- : never
34
- }[L]
11
+ ? DigitArray.ToTuple<[], DigitArray.FromNumber<L>, T>
35
12
  : never
package/ts/math/Digit.ts CHANGED
@@ -51,14 +51,14 @@ export namespace Digit {
51
51
  export namespace DigitArray {
52
52
  export type ToNumber<C extends number[]> = ToTuple<[], C>['length']
53
53
 
54
- export type ToTuple<R extends any[], S extends number[]> =
54
+ export type ToTuple<R extends any[], S extends number[], X = any> =
55
55
  S['length'] extends 0
56
56
  ? R
57
57
  : (S['length'] extends 1
58
- ? [...R, ...Digit.ToTuple[S[0]]]
58
+ ? [...R, ...Digit.ToTuple<X>[S[0]]]
59
59
  : (S extends [any, ...infer T]
60
60
  ? (T extends any[]
61
- ? ToTuple<Multi10<[...R, ...Digit.ToTuple[S[0]]]>, T>
61
+ ? ToTuple<Multi10<[...R, ...Digit.ToTuple<X>[S[0]]]>, T>
62
62
  : never)
63
63
  : never))
64
64