В JavaScript нет встроенной поддержки интерфейсов, как в TypeScript, Java или C#. Однако, их можно заменить несколькими способами, в зависимости от задачи.
Можно описывать структуру объектов с помощью @typedef
и @param
, что помогает при автодополнении и статическом анализе кода.
/**
* @typedef {Object} User
* @property {string} name
* @property {number} age
*/
/**
* @param {User} user
*/
function printUser(user) {
console.log(`Имя: ${user.name}, Возраст: ${user.age}`);
}
const person = { name: "Alice", age: 30 };
printUser(person); // Работает!
Можно создать абстрактный класс с методами-заглушками, которые нужно реализовать в потомках.
class Animal {
constructor(name) {
if (new.target === Animal) {
throw new Error("Нельзя создать экземпляр абстрактного класса!");
}
this.name = name;
}
makeSound() {
throw new Error("Метод makeSound() должен быть переопределён!");
}
}
class Dog extends Animal {
makeSound() {
return "Гав-гав!";
}
}
const dog = new Dog("Бобик");
console.log(dog.makeSound()); // "Гав-гав!"
// const animal = new Animal("Лев"); // Ошибка!
Можно просто проверять, есть ли нужные методы и свойства у объекта перед использованием.
function useDevice(device) {
if (typeof device.turnOn !== "function") {
throw new Error("Объект должен иметь метод turnOn()");
}
device.turnOn();
}
const phone = { turnOn: () => console.log("Телефон включен!") };
useDevice(phone); // "Телефон включен!"
const invalidDevice = { power: true };
// useDevice(invalidDevice); // Ошибка: "Объект должен иметь метод turnOn()"
TypeScript добавляет поддержку интерфейсов в JavaScript.
interface User {
name: string;
age: number;
}
function printUser(user: User) {
console.log(`Имя: ${user.name}, Возраст: ${user.age}`);
}
const person: User = { name: "Alice", age: 30 };
printUser(person); // Работает!
Ставь 👍 и забирай 📚 Базу знаний