Čime se mogu zameniti interfejsi u JavaScript-u?
sobes.tech АИ
Одговор од АИ
Интерфејси у JavaScript-у нису нативно подржани, могу се заменити следећим начинима:
-
Провера типова у току извршавања (Runtime type checking): Коришћење библиотека као што су Zod, Yup или Joi за опис структуре података и валидацију улазних вредности.
// Пример са Zod 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('Валидни подаци корисника:', validUserData); } catch (error) { console.error('Грешка у валидацији:', error.errors); } -
JSDoc: Коментари са анотацијама типова за документацију и пружање информација за IDE и статичке анализаторе.
/** * @typedef {Object} Product * @property {number} id - Јединствени идентификатор производа. * @property {string} name - Име производа. * @property {number} price - Цена производа. */ /** * Приказује информације о производу. * @param {Product} product - Објекат производа. */ function displayProduct(product) { console.log(`Производ: ${product.name}, Цена: ${product.price}`); } const myProduct = { id: 101, name: 'Књига', price: 500 }; displayProduct(myProduct); -
Договори о именовању и документацији: Јасне договоре о томе како треба да се именују својства и методе објеката описани у документацији кода.
-
TypeScript: Најефикаснија метода која омогућава коришћење пуног интерфејса и статичке типизације током развоја.
interface IProduct { id: number; name: string; price: number; displayInfo(): void; // Дефинисање метода } 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(`Производ: ${this.name}, Цена: ${this.price}`); } } const myBook: IProduct = new Book(102, 'Роман', 700); myBook.displayInfo(); -
Афирмативне класе (у одређеној мери): Иако JavaScript нема истинске апстрактне класе, могу се емуловати кроз генерисање грешака приликом покушаја креирања инстанце апстрактне класе или позива "апстрактних" метода.
class AbstractShape { constructor() { if (new.target === AbstractShape) { throw new Error("Није могуће креирати инстанцу апстрактне класе AbstractShape"); } } area() { throw new Error("Метода area мора бити реализована у подкласу"); } } class Circle extends AbstractShape { radius: number; constructor(radius: number) { super(); this.radius = radius; } area(): number { // Реализација апстрактне методе return Math.PI * this.radius * this.radius; } } // const shape = new AbstractShape(); // Изазваће грешку const circle = new Circle(5); console.log("Површина круга:", circle.area());
Важно је разумети да ове методе пружају различите нивое строгости и провере. TypeScript пружа најјачу статичку проверу током компилације, док су остале методе више оријентисане на проверу у току извршавања или документацију.