export interface NotAnArrayType { readonly _: unique symbol; readonly _t: T; } export type ElemType = IfElse, NotAnArrayType, A extends (infer Item)[] ? Item : NotAnArrayType>; export type Eq = [A, B] extends [B, A] ? true : false; export type Simplify = Eq extends true ? A : B; export type IsOptional = Or, ExtendsNull>; type ExtendsUndefined = Eq; type ExtendsNull = Eq; type Or = A extends true ? true : B; export type IfElse = Condition extends true ? Then : Else; export type RequireString = IfElse, B, ExpectedStringButGot>; interface ExpectedStringButGot<_T> { readonly _: unique symbol; } export type Prec = N extends 6 ? 5 : N extends 5 ? 4 : N extends 4 ? 3 : N extends 3 ? 2 : N extends 2 ? 1 : N extends 1 ? 0 : never; export type TuplePath = K extends [] ? A : K extends [infer P, ...infer R] ? P extends keyof A ? TuplePath : never : never; export type DottedPath = K extends keyof A ? A[K] : K extends `${infer P}.${infer R}` ? P extends keyof A ? DottedPath : never : K extends '' ? A : never; export type AnyTuple = N extends 0 ? Acc : AnyTuple, [...Acc, any]>; export type Nth = A extends [ ...AnyTuple, infer U, ...any[] ] ? U : never; /** Useful for working around distributive conditional types */ export type Unnaked = T extends unknown ? T : never; export {};