Sobes.tech
Middle

Sarcina 2: Având mai multe declarații de interfață Todo de mai jos, explicați ce se întâmplă atunci când acestea sunt prezente în același scop. Discutați despre modul în care TypeScript le tratează și completați obiectul `myTodo` pentru a satisface cerințele interfeței Todo fuzionate. ```typescript interface Todo { title: string; dueDate: Date; } interface Todo { description: string; completed: boolean; } interface Todo { priority: 'high' | 'medium' | 'low'; completed: string; } const myTodo: Todo = {}; ```

sobes.tech AI

Răspuns de la AI

В TypeScript при объявлении нескольких интерфейсов с одинаковым именем происходит их слияние (declaration merging). Все свойства из всех интерфейсов объединяются в один итоговый интерфейс.

В данном примере три интерфейса Todo объявлены в одной области видимости, значит итоговый интерфейс будет содержать все свойства из всех трёх объявлений.

Однако есть конфликт: в двух интерфейсах объявлено свойство completed, но с разными типами — boolean и string. TypeScript не может объединить свойства с одинаковым именем, но разными типами, и выдаст ошибку.

Чтобы исправить ситуацию, нужно привести типы completed к одному типу или использовать объединение типов, например:

interface Todo {
    title: string;
    dueDate: Date;
}

interface Todo {
    description: string;
    completed: boolean | string; // объединяем типы
}

interface Todo {
    priority: 'high' | 'medium' | 'low';
}

const myTodo: Todo = {
    title: "Сделать домашку",
    dueDate: new Date('2024-07-01'),
    description: "Домашнее задание по TypeScript",
    completed: false, // или "yes"
    priority: 'high'
};

Если оставить как есть, TypeScript выдаст ошибку из-за конфликта типов completed.

Итог:

  • Интерфейсы с одинаковым именем объединяются.
  • Свойства с одинаковым именем должны иметь совместимые типы.
  • В объекте myTodo нужно указать все свойства из объединённого интерфейса.