Mitä merkki & tarkoittaa TypeScriptin tyypin määrittelyssä?


Tämän tyyppimäärittelytiedoston rivillä 60359 on seuraava ilmoitus:

type ActivatedEventHandler = (
    ev: Windows.ApplicationModel.Activation.IActivatedEventArgs 
        & WinRTEvent<any>
) => void;

Mitä &-merkki tarkoittaa tässä yhteydessä?

Vastaus #1

& tyyppiasemassa tarkoittaa leikkaustyyppiä.

Lisää TypeScriptin dokumentaatiosta leikkaustyypeistä:

https://www.typescriptlang.org/docs/handbook/2/objects.html#intersection-types

Lainaus yllä linkatuista asiakirjoista:

Leikkaustyypit liittyvät läheisesti yhtenäistyyppeihin, mutta niitä käytetään hyvin eri tavalla. Leikkaustyyppi yhdistää useita tyyppejä yhdeksi. Tämä sallii sinun yhdistää olemassa olevia tyyppejä saadaksesi yhden tyypin, joka sisältää kaikki tarvitsemasi ominaisuudet. Esimerkiksi Person & Serializable & Loggable on tyyppi, joka on sekä Person että Serializable että Loggable. Tämä tarkoittaa, että tämän tyyppinen objekti sisältää kaikki kolmen tyypin jäsenet.

Esimerkiksi, jos sinulla olisi verkko-pyyntöjä, joissa on yhtenäinen virheenkäsittely, voit erottaa virheenkäsittelyn omaan tyyppiinsä, joka yhdistetään tyyppeihin, jotka vastaavat yhtä vastaustyyppiä.

interface ErrorHandling {
  success: boolean;
  error?: { message: string };
}

interface ArtworksData {
  artworks: { title: string }[];
}

interface ArtistsData {
  artists: { name: string }[];
}

// These interfaces are composed to have
// consistent error handling, and their own data.

type ArtworksResponse = ArtworksData & ErrorHandling;
type ArtistsResponse = ArtistsData & ErrorHandling;

const handleArtistsResponse = (response: ArtistsResponse) => {
  if (response.error) {
    console.error(response.error.message);
    return;
  }

  console.log(response.artists);
};

Vastaus #2

Leikkaustyyppi Typescriptissä

  • A & TS:ssä tyypin yhteydessä tarkoittaa leikkaustyyppiä.
  • Se yhdistää kahden objektityypin kaikki ominaisuudet ja luo uuden tyypin

Esimerkki:

type dog = {age: number, woof: Function};
type cat = {age: number, meow: Function};

// Type weird is an intersection of cat and dog
// it needs to have all properties of them combined
type weird = dog & cat;

const weirdAnimal: weird = {age: 2, woof: () => {'woof'}, meow: () => {'meow'}}

interface extaprop {
    color: string
}

type catDog = weird & extaprop; // type now also has added color
const weirdAnimal2: catDog = {age: 2, woof: () => {'woof'}, meow: () => {'meow'}, color: 'red'}


// This is different form a union type
// The type below means either a cat OR a dog
type dogOrCat = dog | cat;

Aiheeseen liittyviä artikkeleita