TypeScript: Kuinka voin määritellä tyypin JavaScript-taulukolle, jolla on eri tyyppisiä alkioita mutta ei kiinteää pituutta?


Oletetaan, että minulla on JavaScript-taulukko, jolla on tietty kuvio eri elementtityypeistä alussa, mutta sitten (kuvio) toistuvia elementtityyppejä lopussa mielivaltaisella toistojen määrällä.

Miten voin määritellä TypeScript-tyypin, joka on yhteensopiva tämän JavaScript-taulukon kanssa?

interface A {
  foo: Foo,
  bar: Bar,
}

interface B {
  baz: Baz
}

interface Bat {
  // getArr(): [A, B, B, B],  // tuple type puts types at specific indexes 
                              // but only supports a fixed number of elements
  // getArr(): Array<A | B>,  // array type notation allows arbitrary number 
                              // of elements but doesn't require them to be
                              // in specific positions
}

Muokkaa:

Selventääkseni tarkemmin, kokeilen ulkoisten TypeScript-määritysten käyttöä tavallisen JavaScript-koodin kanssa tunnistaakseni ongelmia olemassa olevassa JavaScript-koodissa. Ymmärrän, että tämä esitys voi olla epäviisas; jos alkuperäisen JavaScript-koodin luomisessa olisi käytetty enemmän viisautta, en olisi lähtenyt tälle seikkailulle.

Vastaus #1

Sellaista ei ole mahdollista määritellä TypeScriptin tyyppijärjestelmässä: taulukoiden täytyy olla yhtenäistä tyyppiä1

Tässä tapauksessa taulukko (Array<c'>) on homogeeninen c', jossa c'=A | B.

Tietenkin, jos tietorakenne voitaisiin purkaa, niin jokin lisä-/monimutkainen koodaus saattaisi olla "sopiva", esim.

[ A, Array<B> ]

1 En tiedä mistään ohjelmointikielen tyyppijärjestelmästä, joka sallisi tällaisen rajoituksen - sitomattomalle sekvenssille - satunnaisten kaavojen sääntöjen perusteella.

Aiheeseen liittyviä artikkeleita