typer - Anvend array-operatoren distributivt i TypeScript
Lad os sige, at jeg har en type, som er en union af litteraler:
type X = "a" | "b" | "c";
Nu vil jeg introducere en ny type, der betegner en union af arrays af hver type i X. Med andre ord vil jeg anvende array-operatoren distributivt over unionen.
Bare at tilføje array-operatoren på typen gør ikke det, jeg vil - dette vil tillade et blandet array f.eks.
type Y = X[]; // ("a" | "b" | "c")[]
const xs: Y = ["a", "b"]; // valid
Men betingede typer har den distributive egenskab, som jeg søger. Jeg synes at kunne opnå mit mål ved at bruge dem i kombination med en betingelse, der aldrig bliver opfyldt:
type Arrayify<T> = T extends never ? never : T[];
type Y = Arrayify<X>; // "a"[] | "b"[] | "c"[]
const xs: Y = ["a", "b"]; // invalid
Så vidt jeg kan bedømme, løser det mit problem, men det føles en smule bagvendt at tage omvejen gennem betingede typer kun for at få distributiviteten. Er der en bedre, mere konventionel måde?
Svar #1
Din tilgang er den rigtige. Brug af betingede typer til distribution er måden at opnå dette på. De anbefalede mønstre for kun at få den distributive adfærd er T extends T eller T extends unknown, men din fungerer også fint i dette tilfælde.
type Arrayify<T> = T extends T ? T[] : never;
