export type ExcludeNullableProps = Prettify<{ [P in keyof T]: NonNullable; }>; export type ItemOrArray = T | T[]; export type ExtractArray = T extends unknown[] ? T : never; export type ExtractArrays> = { [K in keyof T]: ExtractArray; }; export type WithRequired = Prettify & Required>>; export type Prettify = { [K in keyof T]: T[K]; } & {}; export type CamelCaseToKebabCase = T extends `${infer First}${infer Rest}` ? Rest extends Uncapitalize ? `${Lowercase}${CamelCaseToKebabCase}` : `${Lowercase}-${CamelCaseToKebabCase}` : T; export type KebabCaseToCamelCase = T extends `${infer First}-${infer Rest}` ? `${First}${Capitalize>}` : T; /** * Autocompletes string from union, while allowing any other string to be assigned. * * @example * let color: LooseAutocomplete< 'red' | 'green' | 'blue'>; * * color = 'green'; // IDE autocompletes 'red', 'green', 'blue' * color = '#516bc6'; // any string passes type check */ export type LooseAutocomplete = T | (string & {});