Как определить функцию в интерфейсе в Angular?

#javascript #angular #typescript #class #interface

#javascript #angular #typescript #класс #интерфейс

Вопрос:

У меня следующая проблема, для которой я не нашел рабочего решения. У меня есть интерфейс в моем приложении Angular:

 export interface Person {
    forename: string;
    surname: string;
}

  

Как мне определить функцию с именем getFullName() со следующей реализацией:

 getFullName(){
  return this.forename   " "   this.surname;
}
  

Я попробовал это непосредственно в интерфейсе с помощью функции в качестве ключа, но это не сработало…

Комментарии:

1. Интерфейс не может иметь реализации, вы можете только объявить о существовании такого метода ( getFullName(): string ) . Для реализации вам нужен класс.

2. @jonrsharpe Итак, если бы у меня был интерфейс, мне пришлось бы сгенерировать класс для этого интерфейса, если бы у меня была сигнатура функции в моем интерфейсе? Тогда зачем мне нужен интерфейс? Итак, класс был бы лучшей идеей, если у вас есть функции?

3. Вы можете иметь только фактическую функцию в реализации, основанную на классе или иным образом, а не интерфейс. Интерфейсы не существуют в исходящем JS, поэтому не могут иметь реализации.

4. Я думаю, я понял, интерфейс похож на абстрактный класс.

5. Нет, явно нет: «В отличие от интерфейса, абстрактный класс может содержать детали реализации для своих членов».

Ответ №1:

Вы можете использовать сигнатуру функции () => string для представления функции, которая принимает 0 аргументов и возвращает строку.

 export interface Person {
    forename: string;
    surname: string;
    getFullName: () => string;
}
  

Однако вы не можете определить реализацию в интерфейсе.

Чтобы создать класс, который реализует интерфейс, вы можете сделать следующее:

 class MyPerson implements Person {
  constructor(public forename: string, public surname: string) { }
 
  getFullName() {
    return this.forename   " "   this.surname;
  } 
}
  

Возможно, в этом случае вам не нужен пользователь интерфейса — вместо этого вы могли бы просто использовать класс.

Комментарии:

1. И куда бы я поместил реализацию?

2. Обновлено @Opat. Вы должны использовать интерфейс, в котором вы хотите объявить, что объекты имеют определенный тип и, следовательно, могут использоваться определенным образом. Например, если у вас есть несколько разных реализаций классов (например, Student, Teacher), которые имеют Person свойства. Если вы просто хотите создавать объекты person, тогда не беспокойтесь об интерфейсе.

3. Ах, я думаю, теперь я понимаю. Интерфейс похож на абстрактный класс, или я ошибаюсь?

4. Это похожая концепция. Ключевое отличие обычно заключается в том, что интерфейсы не содержат реализаций и что вы можете реализовать несколько интерфейсов (где обычно абстрактные классы могут содержать реализации, а класс может расширять только один абстрактный класс). Это не конкретные правила для каждого языка, но они справедливы для TypeScript. Существует множество ресурсов для абстрактных классов и интерфейсов, поэтому я не буду пытаться перефразировать их здесь, но посмотрите на Google для получения более подробных объяснений.