В TypeScript классы могут подписывать контракты с внешним миром, гарантируя наличие определенных методов и свойств. Для этого используется ключевое слово implements.
Когда класс реализует интерфейс, он обязан содержать все публичные поля и методы, описанные в этом интерфейсе. Это основа для создания предсказуемой архитектуры, где разные классы могут быть взаимозаменяемы, если они реализуют общий интерфейс.
Важно помнить: интерфейс описывает только структуру (сигнатуры методов), но не их реализацию (код внутри {}). Если класс не соблюдает контракт (например, пропустил метод), TypeScript выдаст ошибку компиляции. В этом уроке мы научимся связывать классы с интерфейсами и правильно типизировать методы.
- Модуль 1: Введение в TypeScript
- Модуль 2: Примитивные типы
- Модуль 3: Специальные типы
- Модуль 4: Массивы
- Модуль 5: Кортежи (Tuples)
- Модуль 6: Объекты
- Модуль 7: Функции
- Модуль 8: Union типы
- Модуль 9: Литеральные типы
- Модуль 10: Type Aliases
- Модуль 11: Интерфейсы
- Модуль 12: Type Guards и Narrowing
- Модуль 13: Enums
- Модуль 14: Классы
- Модуль 15: Generics — основы
- Модуль 16: Generics — ограничения
- Модуль 17: Utility Types — базовые
- Модуль 18: Utility Types — работа с Union
- Модуль 19: Utility Types — функции
- Модуль 20: Type Assertions
- Модуль 21: Keyof и Typeof операторы
- Модуль 22: Mapped Types
- Модуль 23: Conditional Types
- Модуль 24: Discriminated Unions
- Модуль 25: Модули и типы
- Модуль 26: Declaration Files
- Модуль 27: Типизация асинхронного кода
- Модуль 28: Практические паттерны
1. Синтаксис реализации
В этом задании вам нужно связать класс User с интерфейсом IUser, используя ключевое слово, которое указывает, что класс реализует данный интерфейс. Класс User должен содержать поля name и age, а также метод greet(), который возвращает приветствие. Ваша задача — дополнить объявление класса, чтобы он корректно реализовывал интерфейс IUser. Обратите внимание на синтаксис TypeScript для реализации интерфейсов.
interface IUser {
name: string;
age: number;
greet(): string;
}
class User input1S IUser {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
greet(): string {
return `Hello, my name is ${this.name} and I am ${this.age} years old.`;
}
}
const user = new User('Alice', 30);
console.log(user.greet());2. Невыполненный контракт
В этом фрагменте TypeScript-кода класс ConsoleLogger должен реализовывать интерфейс Logger, который требует наличие метода log. Однако в классе метод назван иначе, из-за чего контракт интерфейса не выполняется. Найдите и исправьте ошибку в названии метода, чтобы код успешно компилировался и соответствовал интерфейсу.
interface Logger { log(message: string): void;} class ConsoleLogger implements Logger { print(message: string): void { console.log(message); }}3. Сборка класса
Из предложенных строк соберите корректную TypeScript-программу, которая определяет интерфейс Animal с методом move() и реализует его в классе Dog. Класс Dog должен содержать метод move(), выводящий в консоль строку 'Run'. Одна из строк лишняя и в решение входить не должна. Обратите внимание на правильную структуру: объявление интерфейса, затем объявление класса с ключевым словом implements, определение метода и закрывающие фигурные скобки.
interface Animal { move(): void;}class Dog implements Animal { move() { console.log("Run"); }}class Cat { meow() { console.log("Meow"); }}4. Типизация метода
В данном задании представлен фрагмент кода TypeScript, в котором класс реализует интерфейс. Интерфейс определяет метод, возвращающий строку (string). В реализации класса пропущен тип возвращаемого значения этого метода. Вам необходимо выбрать правильный тип из предложенного списка вариантов, чтобы код стал корректным. Обратите внимание на сигнатуру метода в интерфейсе и соответствие реализации.
interface Greeter {
greet(): string;
}
class Person implements Greeter {
greet()input1S {
return "Hello!";
}
}5. Интерфейс vs Класс
В левой колонке приведены сигнатуры методов и свойств из интерфейса TypeScript, а в правой — их возможные реализации в классе. Сопоставьте каждую сигнатуру из интерфейса с соответствующей реализацией в классе. Обратите внимание на типы параметров, возвращаемые значения и модификаторы доступа. Задание поможет закрепить понимание синтаксиса реализации интерфейсов с помощью ключевого слова `implements`.
login(): void;username: string;setPassword(pwd: string): void;readonly id: number;username: string;readonly id: number;login() { console.log("Logging in..."); }setPassword(pwd: string) { this.password = pwd; }6. Обязательные свойства
Внимательно изучите код на TypeScript. Дан интерфейс User и класс Student, который его реализует. Отметьте в классе Student только те свойства, которые объявлены в интерфейсе User и, следовательно, являются обязательными для реализации. Не отмечайте свойства, которых нет в интерфейсе, а также методы и другие элементы класса.
interface User {
name: string;
age: number;
email: string;
}
class Student implements User {
{{name: string;~|~t1}}
{{age: number;~|~t2}}
{{email: string;~|~t3}}
{{studentId: number;~|~t4}}
{{course: string;~|~t5}}
constructor(name: string, age: number, email: string) {
this.name = name;
this.age = age;
this.email = email;
}
getDetails(): string {
return `${this.name}, ${this.age}`;
}
}7. Проверка компиляции
Проанализируйте представленный фрагмент кода TypeScript, в котором класс реализует интерфейс. Внимательно изучите объявленные типы свойств и выберите правильный результат, который возникнет при попытке компиляции этого кода.
interface Person {
name: string;
age: number;
}
class Employee implements Person {
name: number;
age: number;
constructor(name: number, age: number) {
this.name = name;
this.age = age;
}
}