Programming TypeScript


Download 1.81 Mb.
bet63/206
Sana01.11.2023
Hajmi1.81 Mb.
#1737990
1   ...   59   60   61   62   63   64   65   66   ...   206
Bog'liq
Boris Cherny Programming TypeScript Making Your JavaScript Applications (1)

ruxsat bering a : TreeNode = { qiymat : 'a' } ruxsat bering b : LeafNode = { qiymat : 'b' , isLeaf : true } ruxsat c : ichki tugun = { qiymat : 'c' , bolalar : [ b ]}
ruxsat bering a1 = mapNode ( a , _ => _ . toUpperCase ()) // TreeNode ruxsat b1 = mapNode ( b , _ => _ . toUpperCase ()) // LeafNode ruxsat c1 = mapNode ( c , _ => _ . toUpperCase ()) // InnerNode
TreeNode ning pastki turini oladigan va xuddi shu pastki turini qaytaradigan mapNode funksiyasini qanday yozishingiz mumkinligini o'ylab ko'ring . LeafNode - ga o'tish LeafNode - ni , InnerNode-ni InnerNode-ni va TreeNode-ni TreeNode- ni qaytarishi kerak . Davom etishdan oldin buni qanday qilishni o'ylab ko'ring. Buni iloji bormi? Mana javob:

funktsiyasi mapNode < T uzaytiradi TreeNode > ( tugun : T ,
f : ( qiymat : string ) => ip
) : T { qaytish {... tugun ,
qiymat : f ( tugun . qiymat )
}
} mapNode - bu bitta umumiy turdagi parametr T ni belgilaydigan funksiya . T TreeNode ning yuqori chegarasiga ega . Ya'ni, T TreeNode yoki TreeNode ning pastki turi bo'lishi mumkin .
mapNode ikkita parametrni oladi, ulardan birinchisi T tipidagi tugundir . Chunki biz aytganimizda tugun TreeNode ni kengaytiradi , agar biz TreeNode bo'lmagan biror narsani , aytaylik, bo'sh ob'ektni {} , null yoki TreeNode s massivini o'tkazsak , bu bir zumda qizil chiziq bo'ladi. tugun TreeNode yoki TreeNode pastki turi bo'lishi kerak .
mapNode T tipidagi qiymatni qaytaradi . Esda tutingki, T TreeNode yoki TreeNode ning har qanday kichik turi bo'lishi mumkin .
T ni shunday e'lon qilishimiz kerak edi ?

  • T ni faqat T deb yozgan bo‘lsak (o‘chirib qo‘yish TreeNode ni kengaytiradi ), u holda mapNode kompilyatsiya vaqtida xatoga yo‘l qo‘ygan bo‘lardi, chunki siz T tipidagi cheklanmagan tugunda node.value ni xavfsiz o‘qiy olmaysiz (agar foydalanuvchi o‘tgan bo‘lsa-chi? raqammi?).

  • T ni butunlay tark etganimizda va mapNode ni ( tugun : TreeNode, f:

(qiymat: string) => string) => TreeNode bo'lsa, tugunni xaritalashdan keyin biz ma'lumotni yo'qotgan bo'lardik: a1 , b1 va c1 hammasi TreeNode s bo'ladi.
T TreeNode ni kengaytiradi deb aytsak , biz kirish tugunining o'ziga xos turini ( TreeNode , LeafNode yoki InnerNode ) uni xaritalashdan keyin ham saqlab qolamiz.
Bir nechta cheklovlar bilan chegaralangan polimorfizm

Oxirgi misolda biz T ga bitta turdagi cheklov qo'ydik : T kamida TreeNode bo'lishi kerak . Ammo bir nechta turdagi cheklovlarni xohlasangiz nima bo'ladi? Faqatgina ushbu cheklovlarning kesishishini ( & ) kengaytiring:

Download 1.81 Mb.

Do'stlaringiz bilan baham:
1   ...   59   60   61   62   63   64   65   66   ...   206




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