Sobes.tech
Middle

JavaScriptda interfeyslarni nima bilan almashtirish mumkin?

sobes.tech AI

AIdan javob

JavaScriptda interfeyslar tabiiy ravishda qo'llab-quvvatlanmaydi, ammo ularni quyidagicha almashtirish mumkin:

  • Ish vaqtida turini tekshirish (Runtime type checking): Zod, Yup yoki Joi kabi kutubxonalar yordamida ma'lumotlar tuzilishini tavsiflash va kirish qiymatlarini tekshirish.

    // Zod bilan misol
    import { z } from 'zod';
    
    const UserSchema = z.object({
      id: z.number(),
      name: z.string(),
      email: z.string().email(),
    });
    
    try {
      const validUserData = UserSchema.parse({ id: 1, name: 'Alice', email: 'alice@example.com' });
      console.log('Yaroqli foydalanuvchi maʼlumotlari:', validUserData);
    } catch (error) {
      console.error('Tekshirish xatosi:', error.errors);
    }
    
  • JSDoc: IDElar va statik tahlilchilar uchun ma'lumot beradigan tur yozuvlari bilan sharhlar.

    /**
     * @typedef {Object} Product
     * @property {number} id - Mahsulotning noyob identifikatori.
     * @property {string} name - Mahsulot nomi.
     * @property {number} price - Mahsulot narxi.
     */
    
    /**
     * Mahsulot haqida ma'lumotlarni ko'rsatadi.
     * @param {Product} product - Mahsulot obyekti.
     */
    function displayProduct(product) {
      console.log(`Mahsulot: ${product.name}, Narxi: ${product.price}`);
    }
    
    const myProduct = { id: 101, name: 'Kitob', price: 500 };
    displayProduct(myProduct);
    
  • Nomi va hujjatlarni belgilash bo'yicha kelishuvlar: Kod hujjatida tasvirlangan ob'ektlarning xususiyatlari va metodlariga qanday nom berilishi haqida aniq kelishuvlar.

  • TypeScript: Eng samarali usul bo'lib, rivojlanish jarayonida to'liq interfeyslar va statik turdagi tekshiruvlardan foydalanishga imkon beradi.

    interface IProduct {
      id: number;
      name: string;
      price: number;
      displayInfo(): void; // Metod ta'rifi
    }
    
    class Book implements IProduct {
      id: number;
      name: string;
      price: number;
    
      constructor(id: number, name: string, price: number) {
        this.id = id;
        this.name = name;
        this.price = price;
      }
    
      displayInfo(): void {
        console.log(`Mahsulot: ${this.name}, Narxi: ${this.price}`);
      }
    }
    
    const myBook: IProduct = new Book(102, 'Roman', 700);
    myBook.displayInfo();
    
  • Abstrakt sinflar (bir oz): JavaScriptda haqiqiy abstrakt sinflar bo'lmasa-da, ularni xatoliklar chiqarish orqali emulyatsiya qilish mumkin, masalan, abstrakt sinf nusxasini yaratishga yoki "abstrakt" metodlarni chaqirishga urinish.

    class AbstractShape {
      constructor() {
        if (new.target === AbstractShape) {
          throw new Error("AbstractShape abstrakt sinfining nusxasini yaratib bo'lmaydi");
        }
      }
    
      area() {
        throw new Error("area metodi, subklassda amalga oshirilishi kerak");
      }
    }
    
    class Circle extends AbstractShape {
      radius: number;
    
      constructor(radius: number) {
        super();
        this.radius = radius;
      }
    
      area(): number { // Abstrakt metodni amalga oshirish
        return Math.PI * this.radius * this.radius;
      }
    }
    
    // const shape = new AbstractShape(); // Xato
    const circle = new Circle(5);
    console.log("Doira yuzasi:", circle.area());
    

Ushbu metodlarning turli darajadagi qat'iylik va tekshirish imkoniyatlarini tushunish muhimdir. TypeScript eng kuchli statik tekshiruvni taqdim etadi, qolganlari esa ko'proq runtime tekshirish yoki hujjatlashga qaratilgan.