Gépirat-sablon karakterlánctípusok, mint megkülönböztető tényezők

Továbbfejlesztett sablonliterális típusok Typescript 4.5-tel

Mit jelent a „szűkítés” a TS-ben?

Mielőtt megvizsgálnánk a betűtípusok fejlesztését a Typescript 4.5-ös és újabb verzióiban, gyorsan szeretném összefoglalni, mit is jelent ebben az összefüggésben a „szűkítés”. Alapvetően az entitás tulajdonságainak ellenőrzésével szűkítheti le a típust a Typescriptben. Ha az entitáson létezik olyan tulajdonság, amely csak egy bizonyos típushoz érhető el, akkor a Typescript megérti ezt, és ezért tudja biztosítani a megfelelő típusokat.

A következő kódpélda bemutatja, mit értek ezen.

type Addition = {
    sum: number;
}

type Subtraction = {
    result: number;
}

function calculate(action: Addition | Subtraction) {
    if ('sum' in action) {
      // Simple example of using properties
      // of an entity to narrow down its
      // actual type.
      //
      // 'action' is at this point of type
      // 'Addition'. Nice!
      const addition = action;
    }
}

Szűkítés a sablon karakterlánctípusokhoz

A Typescript 4.5-ös verziójától kezdődően ez a minta alkalmazható sablonliterális típusokhoz is, más néven speciális, backtick-es karakterláncokhoz. A mintaillesztés egyre erőteljesebb a nyelvben.

Természetesen ahhoz, hogy a szűkítés használhatóvá váljon, az összehasonlításban szereplő összes típusnak ugyanazt a tulajdonságkulcsot kell megosztania. Ellenkező esetben egyszerűen használhatja a fenti általános szűkítést.

A következő kódpélda bemutatja, hogyan használhatják a sablonkarakterláncok a szűkítést:

type Addition = {
    variant: `${string}-addition`;
    sum: number;
}

type Subtraction = {
    variant: `${string}-subtraction`;
    result: number;
}

function process(action: Addition | Subtraction) {
    if (action.variant === "simple-addition") {
        // Stupid simple example, but you get the idea:
        // We used 'simple-addition', and the pattern 
        // matching by TS understood that '...-addition'
        // can be discriminated to 'Addition'.
        const addition = action;
    }
}
//
// Example that DOES NOT work.
//
// This demo illustrates that the
// discriminante has to be a string,
// else the pattern matching worn't work.

type Addition = {
    variant: `${string}-arithemtic`;
    sum: number;
}

type Subtraction = {
    variant: `${number}-arithemtic`;
    result: number;
}

function process(action: Addition | Subtraction) {
    if (action.variant === "123-arithemtic") {
        // Still 'Addion | Subtraction',
        // as we can only compare against
        // a string '123-arithmetic', which
        // is of course the same for both.
        const addition = action;
    }
}

És most már ismeri a sablonliterálok szűkítését a Typescriptben! Lehet, hogy ez egy olyan funkció, amelyet nem nagyon fog használni, de ha megfelelő, úgy gondolom, hogy jelentősen csökkentheti a kód bonyolultságát, és egy kicsit tisztábban tartja a kódbázist, mint a funkció nélkül.