#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 для получения более подробных объяснений.