type-plus
Version:
Provides additional types for TypeScript.
21 lines (18 loc) • 732 B
text/typescript
import type { IsEqual } from '../equal/equal.js'
export type DropMatch<A extends Readonly<Array<unknown>>, Criteria> = A['length'] extends 0
? // empty tuple
A
: A extends readonly [infer Head, ...infer Tail]
? Tail['length'] extends 0
? // single element tuple
undefined extends Criteria
? DropMatch.ExcludeUnionOfEmptyTuple<Head extends Criteria ? [] : [Head]>
: DropMatch.ExcludeUnionOfEmptyTuple<Head extends Criteria ? [] : [Head]>
: // multiple elements
Exclude<Head, Criteria> extends never
? DropMatch<Tail, Criteria>
: [Exclude<Head, Criteria>, ...DropMatch<Tail, Criteria>]
: never[]
export namespace DropMatch {
export type ExcludeUnionOfEmptyTuple<A> = IsEqual<A, []> extends true ? A : Exclude<A, []>
}