export type OneOrMore = T | T[]; export type ZeroOrMore = undefined | null | T | T[]; export type OneOrMoreIncluding = | RequiredValue | [RequiredValue, ...Other[]] | [...Other[], RequiredValue]; // | [Other, ...OneOrMoreIncluding]; // FIXME TypeScript complains about the circular reference.. // OnlyOne extracts the T from a One/ZeroOrMore type export type OnlyOne = T extends (infer X)[] ? X : T; export function asArray(value: ZeroOrMore): T[] { if (Array.isArray(value)) return value; if (value === undefined || value === null) return []; return [value]; } export function asSingleValue(value: ZeroOrMore): T | undefined { if (value instanceof Array) return value[0]; if (value === undefined || value === null) return undefined; return value; }