Gyakorlat – Általános eszközök implementálása interfészekkel és osztályokkal
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.
Nyissa meg a Játszótért , és távolítsa el a meglévő kódot.
Deklaráljon egy egyszerű felületet
Identity
, amelynek két tulajdonsága ésvalue
message
két általános típusváltozója van,T
valamintU
a tulajdonságtípusokhoz.interface Identity<T, U> { value: T; message: U; }
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.
Folytassa a munkát a játszótéren.
Deklaráljon egy olyan általános felületet
ProcessIdentity
, 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; }
Deklaráljon egy olyan függvényt
processIdentity
, amelynek a típusa megegyezik azProcessIdentity
illesztővel.function processIdentity<T, U> (value: T, message: U) : T { console.log(message); return value }
Deklaráljon egy függvénytípus változót, amelyet az interfész hív
processor
meg változótípusként, és adjanumber
meg aT
típust ésstring
aU
típust.ProcessIdentity
Ezután rendelje hozzá aprocessIdentity
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.
Folytassa a munkát a játszótéren.
Deklaráljon egy olyan felületet
ProcessIdentity
,value
amelynek két tulajdonsága ésmessage
két általános típusváltozója van,T
valamintU
a tulajdonságtípusokhoz. Ezután adjon hozzá egy általános aláírást egy metódushozprocess
, amely egy típusértéketT
ad vissza.interface ProcessIdentity<T, U> { value: T; message: U; process(): T; }
Definiáljon egy általános osztályt, amely
processIdentity
implementálja aProcessIdentity
felületet. Ebben az esetben nevezze el a változótípusokat az osztálybanX
ésY
aprocessIdentity
. 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 } }
Deklaráljon egy új változót, és rendeljen hozzá egy új
processIdentity
objektumot, adja át ésstring
adja megnumber
aY
X
változótípusokat, valamint anumber
ésstring
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'