@StockholmSyndrome

Как слить интерфейс с классом, если они находятся в разных файлах?

если они находятся в одном файле, то проблем нет
// a.ts 

interface A {
  f(m: 'string'): string;
  f(m: 'number'): number;
}

class A {
  f(m: string): any {
    // ...
  }
}

const a = new A(); 
a.f('string'); // returns string
a.f('number'); // returns number


но если попытаться разместить их в разных файлах, и экспортировать интерфейс, то редактор будет ругаться на конфликт имён
// a.ts 
interface A {
  f(m: 'string'): string;
  f(m: 'number'): number;
}

export default A;

// b.ts 
import A from './a'; // Import declaration conflicts with local declaration of 'A'.

class A {
  f(m: string): any {
    // ...
  }
}


я могу объявить класс с другим названием, который будет реализовывать интерфейс, но тогда мне придётся указывать тип явно
class B implements A {
  f(m: string): any {
    // ...
  }
}

const a: A = new B(); 
a.f('string'); // returns string
a.f('number'); // returns number


есть ли у меня возможность именно слить интерфейс с классом?
  • Вопрос задан
  • 1219 просмотров
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
Взгляните на этот пример, пусть наличие implements вас не обманывает
https://www.typescriptlang.org/play/#code/JYOwLgpg...

Суть в том, что вы не "сливаете" класс с интерфейсом, вы делаете Declaration Merging, тайпскрипт замещает тип предыдущим типом сливая их определения. Это допустимо, если типы объявлены в одном модуле. А когда вы делаете импорт из другого модуля - это ошибка.

я могу объявить класс с другим названием, который будет реализовывать интерфейс, но тогда мне придётся указывать тип явно

это в любом случае так, переменная получает класс по имени конструктора. Просто в первом случае интерфейс A исчез, остался только класс.

Почитать по теме https://www.typescriptlang.org/docs/handbook/decla...

В общем во избежании путаницы, не стоит так делать в живом коде, как выше написали делайте разные имена. И в ts вообще нет особой нужды для этого, implements обычно используется чтобы не забыть реализовать нужные методы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08
interface ITable {}

class Table implements ITable {}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы