Gyakorlat – Általános eszközök implementálása interfészekkel és osztályokkal

Befejeződött

A generikusok csak a típusok összetevőnek való átadására szolgálnak, így nem csak a natív típusokat alkalmazhatja általános típusváltozókra, hanem interfészekre, függvényekre és osztályokra is. Ebben a leckében különböző módokon használhat általános generikusokat ezekkel az összetett típusokkal.

Próbáljon meg általános generákat használni interfészekkel, függvényekkel és osztályokkal. Az összes kódminta alapvetően ugyanazokat a feladatokat végzi el különböző megközelítések használatával.

Általános felület deklarálása

A felületi deklarációkban általános értékeket használhat, ha a típusjegyzeteket típusváltozókra cseréli.

  1. Nyissa meg a Játszótért , és távolítsa el a meglévő kódot.

  2. Deklaráljon egy egyszerű felületet Identity , amelynek két tulajdonsága és value messagekét általános típusváltozója van, T valamint Ua tulajdonságtípusokhoz.

    interface Identity<T, U> {
        value: T;
        message: U;
    }
    
  3. Deklaráljon két változót, és használja az Identity interfészt objektumtípusként.

    let returnNumber: Identity<number, string> = {
        value: 25,
        message: 'Hello!'
    }
    let returnString: Identity<string, number> = {
        value: 'Hello!',
        message: 25
    }
    

Általános felület deklarálása függvénytípusként

Az általános felületet függvénytípusként is deklarálhatja.

  1. Folytassa a munkát a játszótéren.

  2. Deklaráljon egy olyan általános felületetProcessIdentity, amely tartalmazza egy metódus általános aláírását. (value: T, message: U): T Figyelje meg, hogy a metódusnak nincs neve. Ezzel bármely, egyező típusú aláírással rendelkező függvényre alkalmazhatja.

    interface ProcessIdentity<T, U> {
        (value: T, message: U): T;
    }
    
  3. Deklaráljon egy olyan függvényt processIdentity , amelynek a típusa megegyezik az ProcessIdentity illesztővel.

    function processIdentity<T, U> (value: T, message: U) : T {
        console.log(message);
        return value
    }
    
  4. Deklaráljon egy függvénytípus változót, amelyet az interfész hív processor meg változótípusként, és adja number meg a T típust és string a U típust.ProcessIdentity Ezután rendelje hozzá a processIdentity függvényt. Ezt a változót mostantól függvényként használhatja a kódban, és a TypeScript ellenőrzi a típusokat.

    let processor: ProcessIdentity<number, string> = processIdentity;
    let returnNumber1 = processor(100, 'Hello!');   // OK
    let returnString1 = processor('Hello!', 100);   // Type check error
    

Általános felület deklarálása osztálytípusként

Általános felületet is deklarálhat, és egy osztályban implementálhatja.

  1. Folytassa a munkát a játszótéren.

  2. Deklaráljon egy olyan felületet ProcessIdentity , value amelynek két tulajdonsága és messagekét általános típusváltozója van, T valamint Ua tulajdonságtípusokhoz. Ezután adjon hozzá egy általános aláírást egy metódushoz process , amely egy típusértéket Tad vissza.

    interface ProcessIdentity<T, U> {
        value: T;
        message: U;
        process(): T;
    }
    
  3. Definiáljon egy általános osztályt, amely processIdentity implementálja a ProcessIdentity felületet. Ebben az esetben nevezze el a változótípusokat az osztályban X és Ya processIdentity . A felületen és az osztályban különböző változóneveket használhat, mivel a típusérték propagálja a láncot, és a változó neve nem számít.

    class processIdentity<X, Y> implements ProcessIdentity<X, Y> {
        value: X;
        message: Y;
        constructor(val: X, msg: Y) {
            this.value = val;
            this.message = msg;
        }
        process() : X {
            console.log(this.message);
            return this.value
        }
    }
    
  4. Deklaráljon egy új változót, és rendeljen hozzá egy új processIdentity objektumot, adja át és string adja meg number a Y X változótípusokat, valamint a number és string argumentumértékeket.

    let processor = new processIdentity<number, string>(100, 'Hello');
    processor.process();           // Displays 'Hello'
    processor.value = '100';       // Type check error
    

Általános osztály definiálása

Általános osztályt interfész nélkül is deklarálhat. Ez a példa általános osztályként deklarál processIdentity a ProcessIdentity felület implementálása nélkül.

class processIdentity<T, U> {
    private _value: T;
    private _message: U;
    constructor(value: T, message: U) {
        this._value = value;
        this._message = message;
    }
    getIdentity() : T {
        console.log(this._message);
        return this._value
    }
}
let processor = new processIdentity<number, string>(100, 'Hello');
processor.getIdentity();      // Displays 'Hello'