Härled typen av en array i Typescript


Jag har en typ som är definierad i ett tredjepartsbibliotek. Låt oss säga att dess form är:

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

Finns det ett sätt att härleda typen { bar: string }?

Jag skulle vilja använda det så här:

type Baz = /* derived type */

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

Jag tittade på nyttotyper... men kunde inte lista ut hur man riktar in sig på den delen av typdefinitionen.

Svar #1

Arrayer indexerade med number ger dig medlemstypen för arrayen, eftersom arrayer är indexerade med heltal.

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

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

Lekplats

Svar #2

Fick lite hjälp från en TS-trollkarl. Detta är en fungerande lösning:

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"]>;

Skulle älska om någon kunde hjälpa till att förklara ternära uttrycket dock.