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.
- package/cjs/array/CreateTuple.d.ts +2 -10
- package/cjs/math/Digit.d.ts +1 -1
- package/package.json +1 -1
- package/ts/array/CreateTuple.spec.ts +4 -2
- package/ts/array/CreateTuple.ts +3 -26
- package/ts/math/Digit.ts +3 -3
|
@@ -1,10 +1,2 @@
|
|
|
1
|
-
import { IsPositive } from '../math';
|
|
2
|
-
declare type
|
|
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;
|
package/cjs/math/Digit.d.ts
CHANGED
|
@@ -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
|
@@ -9,11 +9,13 @@ test('single element', () => {
|
|
|
9
9
|
})
|
|
10
10
|
|
|
11
11
|
test('multiple elements', () => {
|
|
12
|
-
|
|
12
|
+
type A = CreateTuple<3>
|
|
13
|
+
isType.equal<true, [any, any, any], A>()
|
|
13
14
|
})
|
|
14
15
|
|
|
15
16
|
test('override element type', () => {
|
|
16
|
-
|
|
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', () => {
|
package/ts/array/CreateTuple.ts
CHANGED
|
@@ -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
|
|
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
|
|