Programming TypeScript
turi LegacyUser = { id? : raqam | ip
Download 1.81 Mb.
|
Boris Cherny Programming TypeScript Making Your JavaScript Applications (1)
- Bu sahifa navigatsiya:
- Funktsiya farqi
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 farqiKeling, 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 : A ning bu turi ko'rsatilmagan yoki >: B ning bu turi. A ning har bir parametri >: uning B dagi mos parametri . 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: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling