Typescript: finnes det et typemap for arrayer


Si at jeg har en liste med boolske verdier:

const a: boolean[] = [true, false, false];

Kan jeg lage en typebetingelse som bare utløses når minst én av booleanene er sann?


Jeg kan gjøre det for tilfellet der de alle er sanne:

type BList = true[] | false[];

type AreAllTrue<T extends BList> = T[number] extends true ? true : false;

const a: BList = [true, true, true];

const b: AreAllTrue<typeof a> = true; // This compiles
const c: AreAllTrue<typeof a> = false; // This doesn't (as expected)

// type AnyAreTrue<???> = ???

Men jeg trenger at listen inneholder både true og false, ikke bare en liste full av én type boolean.

Svar #1

Kanskje er dette det du vil ha?

type AnyIsTrue<T extends boolean[]> = T extends false[] ? false : true

type _test0 = AnyIsTrue<[]>  // false
type _test1 = AnyIsTrue<[false]>  // false
type _test2 = AnyIsTrue<[false, true]>  // true
type _test3 = AnyIsTrue<[false, true, false]>  // true

Forhåpentligvis gir dette mening: et array av boolske verdier har ingen true-verdier hvis og bare hvis det er en subtype av false[].


Men, som jeg sa i kommentaren, hvis typen til variabelen din er boolean[], kan ikke TypeScript si mye om det. Den vet ikke hvilke verdier som er i arrayen.

type _test4 = AnyIsTrue<boolean[]>  // true

Relaterte artikler