turi ClassConstructor < T > = yangi (... args : har qanday []) => T funktsiyasi seriyali <
Dekoratorlar
T uzaytiradi ClassConstructor < { getValue () : Foydali yuk
} >
> ( Konstruktor : T ) {
qaytish sinf uzaytiradi Konstruktor {
serialize() {
qaytish bu . getValue (). toString ()
}
}
}
Esingizda bo'lsin, new() bu biz TypeScript-da sinf konstruktorini tizimli ravishda qanday yozamiz. Kengaytirilishi mumkin bo'lgan sinf konstruktori uchun TypeScript uning argumentlarini istalgan spred bilan yozishimizni talab qiladi : new(... any[]) .
@serializable .getValue usulini qo'llaydigan har qanday sinfni bezatishi mumkin , bu esa Payloadni qaytaradi .
Sinf dekoratorlari bitta argumentni - sinfni qabul qiladigan funktsiyalardir. Agar dekorator funksiyasi sinfni qaytarsa (misoldagi kabi) u ish vaqtida o'zi bezatayotgan sinfni almashtiradi; aks holda, u asl sinfni qaytaradi.
yo'lda .serialize usulini qo'shadigan sinfni qaytaramiz .
.serialize ga qo'ng'iroq qilmoqchi bo'lganimizda nima bo'ladi ?
ruxsat bering foydali yuk = yangi APIPayload
ruxsat bering seriallashtirilgan = foydali yuk . serialize () // Xato TS2339: "Serializatsiya" xususiyati qiladi // "APIPayload" turida mavjud emas.
TypeScript dekorator o'zi bezab turgan narsaning shaklini o'zgartirmasligini taxmin qiladi, ya'ni siz usullar va xususiyatlarni qo'shmagan yoki olib tashlamagansiz. U kompilyatsiya vaqtida siz qaytargan sinf siz oʻtgan sinfga tayinlanishi mumkinligini tekshiradi, lekin yozish vaqtida TypeScript sizning dekorativlaringizda yaratgan kengaytmalaringizni kuzatmaydi.
TypeScript-dagi dekorativlar yanada etuk xususiyatga aylanmaguncha, ulardan foydalanishdan qochishingizni va o'rniga oddiy funksiyalarga yopishib olishingizni tavsiya qilaman:
ruxsat bering Bezatilgan APIpayload = seriyali ( APIPayload )
Do'stlaringiz bilan baham: |