Gyakorlat – Felület kiterjesztése a TypeScriptben
Az interfészek kiterjeszthetik egymást. Ez lehetővé teszi, hogy az egyik felület tagjait egy másikba másolja, így nagyobb rugalmasságot biztosít a felületek újrafelhasználható összetevőkre való elválasztásának módjában.
Ha egy felületet egy vagy több adapterrel bővít, a következő szabályok vonatkoznak:
- Az összes adapter összes szükséges tulajdonságát implementálnia kell.
- Két illesztőnek ugyanaz a tulajdonsága lehet, ha a tulajdonság neve és típusa pontosan megegyezik.
- Ha két adapter azonos nevű, de különböző típusú tulajdonsággal rendelkezik, de deklarálnia kell egy új tulajdonságot, hogy az eredményül kapott tulajdonság mindkét felület altípusa legyen.
Interfész kiterjesztése
Többféle desszertet hozhat létre a IceCream
felületről (napda, turmix stb.), de mindegyiknek különböző tulajdonságai vannak a deklaráltakon IceCream
kívül. Bővítsük ki a felületet egy új, úgynevezett felülettel Sundae
, és deklaráljuk a tulajdonságait.
Folytassa a projektet a Játszótéren.
Az interfész deklarációja
IceCream
alatt deklaráljon egy új felületet, amelynek az a neveSundae
, hogyextends
azIceCream
interfész. ASundae
felület négy új tulajdonságot tartalmaz:sauce
literál típusú'chocolate' | 'caramel' | 'strawberry'
nuts
típusúboolean
(nem kötelező)whippedCream
típusúboolean
(nem kötelező)instructions
típusúboolean
(nem kötelező)
interface Sundae extends IceCream { sauce: 'chocolate' | 'caramel' | 'strawberry'; nuts?: boolean; whippedCream?: boolean; instructions?: boolean; }
Hiba jelenik meg az új felületen. A TypeScript azt észlelte, hogy mind a felületek, mind a
IceCream
Sundae
felületek rendelkeznek egy úgynevezett tulajdonságokkalinstructions
, de különböző típusúak. A hiba megoldásához mindkét tulajdonságot azonos típusúvá kell tenniinstructions
.string
Próbáljuk ki az új felületet úgy, hogy a változót
myIceCream
típusraSundae
módosítjuk. Ez a hiba azt jelzi, hogy a"mártás" tulajdonság hiányzik a(z) "{ flavor: string; scoops: number; }" típusban, de a "Sundae" típusban szükséges. Négy új tulajdonságot adott hozzá a Sundae felülethez, de csak a mártási tulajdonságra volt szükség.let myIceCream: Sundae = { flavor: 'vanilla', scoops: 2 }
Javítsa ki a hibát a szükséges tulajdonság hozzáadásával, valamint a használni kívánt választható tulajdonságok bármelyikével.
let myIceCream: Sundae = { flavor: 'vanilla', scoops: 2, sauce: 'caramel', nuts: true }
Most próbálja meg implementálni az
Sundae
interfészt atooManyScoops
függvényben. Magának a függvénynek nem szabad hibákat látnia, de a függvény következő sorban való hívása hibát okoz. Ennek az az oka, hogy három szükséges paramétert vár. Javítsa ki a hibát, ha hozzáadja asauce
tulajdonságot a függvényhíváshoz.function tooManyScoops(dessert: Sundae) { if (dessert.scoops >= 4) { return dessert.scoops + ' is too many scoops!'; } else { return 'Your order will be ready soon!'; } } console.log(tooManyScoops({flavor: 'vanilla', scoops: 5, sauce: 'caramel'}));