Deriveți tipul unui array în Typescript


Am un tip care este definit într-o bibliotecă terță parte. Să spunem că forma sa este:

type Foo = {
  id: string
  results: Array<{ bar: string }>
}

Există o modalitate de a deriva tipul { bar: string }?

Aș dori să-l folosesc astfel:

type Baz = /* derived type */

const baz: Baz = { bar: 'abc' }

Mă uitam la tipurile de utilitate... dar nu am reușit să înțeleg cum să vizez acea parte a definiției tipului.

Răspuns #1

Tablourile indexate prin number îți oferă tipul membrului tabloului, deoarece tablourile sunt indexate prin întregi.

type Foo = {
  id: string
  results: Array<{ bar: string }>
}

type Baz = Foo['results'][number]
const baz: Baz = { bar: 'abc' }

Teren de joacă

Răspunsul #2

Am primit ajutor de la un vrăjitor TS. Aceasta este o soluție care funcționează:

type Foo = {
  id: string
  results: Array<{bar: string}>
}

type ElementsOf<T extends unknown[]> = T extends ReadonlyArray<infer E> ? E : never;

// type Baz = { bar: string; } 
type Baz = ElementsOf<Foo["results"]>;

Mi-ar plăcea dacă cineva ar putea să explice totuși operatorul ternar.