Sobes.tech
Middle

JavaScript-də interfeyslər nə ilə əvəz oluna bilər?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də interfeyslər yerli olaraq nəzərdə tutulmayıb, onları aşağıdakı yollarla əvəz etmək olar:

  • İcra zamanı növ yoxlaması (Runtime type checking): Zod, Yup və ya Joi kimi kitabxanaları istifadə edərək məlumatların strukturu və daxil olan dəyərlərin yoxlanması.

    // Zod nümunəsi
    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('İstifadəçi məlumatları düzgündür:', validUserData);
    } catch (error) {
      console.error('Yoxlama xətası:', error.errors);
    }
    
  • JSDoc: IDE və statik analizatorlar üçün sənədləşdirmə və məlumat təmin etmək üçün tip anotasiya şərhləri.

    /**
     * @typedef {Object} Product
     * @property {number} id - Məhsulun unikal identifikatoru.
     * @property {string} name - Məhsulun adı.
     * @property {number} price - Məhsulun qiyməti.
     */
    
    /**
     * Məhsul haqqında məlumatı göstərir.
     * @param {Product} product - Məhsul obyekti.
     */
    function displayProduct(product) {
      console.log(`Məhsul: ${product.name}, Qiymət: ${product.price}`);
    }
    
    const myProduct = { id: 101, name: 'Kitab', price: 500 };
    displayProduct(myProduct);
    
  • Adlandırma razılaşmaları və sənədləşdirmə: Obiektlərin xüsusiyyət və metodlarının adlandırılması ilə bağlı aydın razılaşmalar.

  • TypeScript: Tam interfeyslər və statik tip yoxlaması üçün ən effektiv üsul.

    interface IProduct {
      id: number;
      name: string;
      price: number;
      displayInfo(): void; // Metodun təyini
    }
    
    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(`Məhsul: ${this.name}, Qiymət: ${this.price}`);
      }
    }
    
    const myBook: IProduct = new Book(102, 'Roman', 700);
    myBook.displayInfo();
    
  • Abstrakt siniflər (bir qədər): JavaScript-də həqiqi abstrakt siniflər olmasa da, onları səhv mesajları ilə yaradaraq və ya "abstrakt" metodların çağırılması ilə emulyasiya etmək olar.

    class AbstractShape {
      constructor() {
        if (new.target === AbstractShape) {
          throw new Error("AbstractShape abstrakt sinifinin nümunəsini yarada bilməzsiniz");
        }
      }
    
      area() {
        throw new Error("area metodu alt sinifdə həyata keçirilməlidir");
      }
    }
    
    class Circle extends AbstractShape {
      radius: number;
    
      constructor(radius: number) {
        super();
        this.radius = radius;
      }
    
      area(): number { // Abstrakt metodun həyata keçirilməsi
        return Math.PI * this.radius * this.radius;
      }
    }
    
    // const shape = new AbstractShape(); // Xəta verəcək
    const circle = new Circle(5);
    console.log("Dairənin sahəsi:", circle.area());
    

Əhəmiyyətli olan odur ki, bu metodlar müxtəlif səviyyələrdə sərtlik və yoxlamalar təmin edir. TypeScript ən güclü statik yoxlamanı təmin edir, digər metodlar isə daha çox icra zamanı yoxlama və ya sənədləşdirmə üçün nəzərdə tutulub.