Programming TypeScript


turi LegacyUser = { id? : raqam | ip


Download 1.81 Mb.
bet94/206
Sana01.11.2023
Hajmi1.81 Mb.
#1737990
1   ...   90   91   92   93   94   95   96   97   ...   206
Bog'liq
Boris Cherny Programming TypeScript Making Your JavaScript Applications (1)

turi LegacyUser = { id? : raqam | ip nomi : string }
ruxsat bering eski foydalanuvchi : LegacyUser = {
identifikatori : '793331' , nomi : 'Sin Yang' }
deleteUser ( legacyUser ) // Xato TS2345: "LegacyUser" turidagi argument emas
// '{id?: raqam | turidagi parametrga tayinlanishi mumkin
// aniqlanmagan, nomi: string}'. "string" turi emas // 'raqam | turiga tayinlanishi mumkin aniqlanmagan'.
Turi kutilgan turdagi supertip bo'lgan xususiyatga ega shaklni uzatganimizda, TypeScript shikoyat qiladi. Buning sababi, id - string | raqam | undefined , va deleteUser faqat | sonli identifikatorning holatini boshqaradi aniqlanmagan .
<: ularning kutilgan turlariga ega bo'lgan xususiyat turlarini ham o'tkazishingiz mumkin , lekin ularning kutilgan turlarining supertiplari bo'lgan xususiyat turlari bilan shaklni o'tkazib bo'lmaydi. Turlar haqida gapirganda, biz TypeScript shakllari (ob'ektlar va sinflar) o'zlarining xossa turlari bo'yicha kovariant ekanligini aytamiz. Ya'ni, A ob'ekti B ob'ektiga tayinlanishi uchun uning har bir xossasi < bo'lishi kerak: B dagi tegishli xossa .
Umuman olganda, kovariatsiya to'rt turdagi dispersiyadan biridir:
O'zgarmaslik
Siz aniq T ni xohlaysiz .
Kovarians Siz <:T ni xohlaysiz .
Contravariance Siz >:T ni xohlaysiz . Ikki xillik
<:T yoki >:T bilan yaxshisiz .
TypeScript-da har bir murakkab tur o'z a'zolarida kovariant bo'ladi - ob'ektlar, sinflar, massivlar va funktsiyani qaytarish turlari - bitta istisno: kontravariant bo'lgan funksiya parametrlari turlari .
H amma tillar ham shunday dizayn qarorini qabul qilmaydi. Ba'zi tillarda ob'ektlar o'zlarining mulk turlarida o'zgarmasdir , chunki biz ko'rganimizdek, kovariant xususiyat turlari xavfli xatti-harakatlarga olib kelishi mumkin. Ba'zi tillarda o'zgaruvchan va o'zgarmas ob'ektlar uchun har xil qoidalar mavjud (uni o'zingiz o'ylab ko'ring!). Ba'zi tillar, masalan, Scala, Kotlin va Flow - hatto dasturchilar uchun o'zlarining ma'lumotlar turlari uchun farqni belgilash uchun aniq sintaksisga ega.
TypeScript-ni loyihalashda uning mualliflari foydalanish qulayligi va xavfsizlik o'rtasidagi muvozanatni tanladilar. Ob'ektlarni o'z mulk turlari bo'yicha o'zgarmas qilib qo'yganingizda, garchi u xavfsizroq bo'lsa ham, u tip tizimini ishlatishni zerikarli qilishi mumkin, chunki siz amalda xavfsiz bo'lgan narsalarni taqiqlab qo'yasiz (masalan, agar biz deleteUser da identifikatorni o'chirmagan bo'lsak , keyin ) . kutilgan turdagi supertip bo'lgan ob'ektga o'tish mutlaqo xavfsiz bo'lar edi).
Funktsiya farqi

Keling, bir nechta misollar bilan boshlaylik.
Agar A funksiyasi B ga nisbatan bir xil yoki past aritite (parametrlar soni) bo‘lsa va: A funksiyasi B funksiyaning kichik turi hisoblanadi :

  1. A ning bu turi ko'rsatilmagan yoki >: B ning bu turi.

  2. A ning har bir parametri >: uning B dagi mos parametri .

  3. A ning qaytish turi <: B ning qaytish turi.

Buni bir necha marta o'qing va har bir qoida nimani anglatishini tushunganingizga ishonch hosil qiling. Eʼtibor bergan boʻlishingiz mumkinki, A funksiyasi B funksiyasining kichik turi boʻlishi uchun uning bu turi va parametrlari B dagi oʻxshashlari >: boʻlishi kerak , qaytaruvchi turi esa <: ! Nega yo'nalish bunday ag'dariladi? Nima uchun ob'ektlar, massivlar, birlashmalar va boshqalar uchun bo'lgani kabi har bir komponent uchun ( ushbu tur, parametr turlari va qaytish turi) oddiygina <: emas ?
Bu savolga javob berish uchun keling , uni o'zimiz chiqaramiz. Biz uchta turni aniqlashdan boshlaymiz (aniqlik uchun sinfdan foydalanamiz , lekin bu A <: B <: C bo'lgan har qanday turdagi tanlov uchun ishlaydi ):

Download 1.81 Mb.

Do'stlaringiz bilan baham:
1   ...   90   91   92   93   94   95   96   97   ...   206




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling