Properly type chunk method (#46699)

Improve `flatten` return type
This commit is contained in:
Alexey Gerasimov 2020-08-27 08:46:07 +05:00 committed by GitHub
parent ec87acd45f
commit 7e4cb54a7d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 5 deletions

View File

@ -5,7 +5,7 @@
// Gabriel Lorquet <https://github.com/gablorquet>
// Alexey Gerasimov <https://github.com/fan-tom>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.9
// TypeScript Version: 3.4
declare namespace LazyJS {
interface LazyStatic {
@ -136,14 +136,45 @@ declare namespace LazyJS {
: T
// workaround for https://github.com/microsoft/TypeScript/issues/26980
: {
0: T extends Sequence<infer U> ? Flatten<U, Shallow> : never;
0: T extends Sequence<infer U>
? Flatten<U, Shallow>
: T extends Array<infer U>
? Flatten<U, Shallow>
: T extends ReadonlyArray<infer U>
? Flatten<U, Shallow>
: never;
1: T;
} [T extends Sequence<any> ? 0 : 1];
} [T extends Sequence<any> ? 0 : T extends any[] ? 0 : T extends ReadonlyArray<any> ? 0 : 1];
type PushFront<TailT extends any[], FrontT> = (
((front: FrontT, ...rest: TailT) => any) extends ((...tuple: infer TupleT) => any) ?
TupleT :
never
);
type Tuple<ElementT, LengthT extends number, OutputT extends any[] = []> = {
0: ElementT[],
1: unknown,
2: OutputT,
3: Tuple<ElementT, LengthT, PushFront<OutputT, ElementT>>,
}[
// LengthT is not compile-time constant
number extends LengthT
? 0
// LengthT is 0 constant, forbidden
: LengthT extends 0
? 1
// LengthT = OutputT["length']
: OutputT["length"] extends LengthT
? 2
// we need to go deeper
: 3
];
interface SequenceBaser<T> {
// TODO improve define() (needs ugly overload)
async(interval: number): AsyncSequence<T>;
chunk(size: number): Sequence<T>;
chunk<N extends number>(size: N): Sequence<Tuple<T, N>>;
compact(): Sequence<T>;
concat(var_args: T[]): Sequence<T>;
consecutive(length: number): Sequence<T>;

View File

@ -20,6 +20,8 @@ var barArr: Bar[];
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
var fooSequence: LazyJS.Sequence<Foo>;
var fooTupleSequence: LazyJS.Sequence<readonly [Foo, Foo, Foo, Foo, Foo]>;
var fooArrSequence: LazyJS.Sequence<Foo[]>;
var barSequence: LazyJS.Sequence<Bar>;
var fooArraySeq: LazyJS.ArrayLikeSequence<Foo>;
var barArraySeq: LazyJS.ArrayLikeSequence<Bar>;
@ -29,11 +31,13 @@ var fooAsyncSeq: LazyJS.AsyncSequence<Foo>;
var strSequence: LazyJS.Sequence<string>;
var anySequence: LazyJS.Sequence<any>;
var unknownSequence: LazyJS.Sequence<unknown>;
var stringSeq: LazyJS.StringLikeSequence;
var obj: Object;
var bool: boolean;
var num: number;
var const5: 5;
var str: string;
var x: any = null;
var arr: any[];
@ -97,7 +101,9 @@ fooArraySeq = Strict([foo, foo]).pop();
// Sequence
fooAsyncSeq = fooSequence.async(num);
fooSequence = fooSequence.chunk(num);
fooArrSequence = fooSequence.chunk(num);
fooTupleSequence = fooSequence.chunk(const5);
unknownSequence = fooSequence.chunk(0);
fooSequence = fooSequence.compact();
fooSequence = fooSequence.concat(arr);
fooSequence = fooSequence.consecutive(num);