export type KeysMatching = { [K in keyof T]-?: T[K] extends V ? K : never }[keyof T] export type Require = Omit & Required> export type AnyCase = string extends T ? string : T extends `${infer F1}${infer F2}${infer R}` ? (`${Uppercase | Lowercase}${Uppercase | Lowercase}${AnyCase}`) : T extends `${infer F}${infer R}` ? `${Uppercase | Lowercase}${AnyCase}` : '' // This is a bit of a hacky type because // TS < 4.8 doesn't support ranges well // but it saves a bunch of boilerplate :) export type NumberRange< N extends number, M extends number, Result extends unknown[] = [N] > = (Result['length'] extends M ? [...Result, M] : NumberRange ) export type MaybeArray = T | T[] // Converts types like { A: boolean } & { B: number } & { C: string } into a { A: boolean, B: number, C: string} // this type is somewhat magical and don't wanna mess with the {} // eslint-disable-next-line @typescript-eslint/ban-types export type Simplify = { [K in keyof T]: T[K] } & {} export type Equals = (() => G extends T ? 1 : 2) extends (() => G extends U ? 1 : 2) ? true : false