Интерфейсы

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

Следующие два являются эквивалентными объявлениями, первое с использованием встроенных аннотаций, а второе с использованием интерфейсов:

// Sample A
declare const myPoint: { x: number; y: number };

// Sample B
interface Point {
  x: number;
  y: number;
}
declare const myPoint: Point;

Преимущество примера B состоит в том, что если кто-то создает библиотеку на основе myPoint для добавления новых аргументов, он может легко добавить в существующее объявление myPoint:

// Lib a.d.ts
interface Point {
  x: number,
  y: number
}
declare const myPoint: Point

// Lib b.d.ts
interface Point {
  z: number
}

// Your code
let myPoint.z // Allowed!

Поскольку интерфейс TypeScript открыт для дополнения, это важный принцип TypeScript, который позволяет использовать интерфейс для имитации расширяемости JavaScript.

Классы могут реализовывать интерфейсы

Если вы хотите использовать классы, которые должны следовать структуре объекта, которую кто-то объявил для вас в interface , вы можете использовать ключевое слово implements для обеспечения совместимости:

По сути, при наличии implements любые изменения внешнего интерфейса Point вызовут ошибки компиляции в базе кода, поэтому его можно легко синхронизировать:

Обратите внимание, что implements ограничивает структуру экземпляров классов, а именно:

Такие вещи, как foo: Point = MyPoint - это не одно и то же.

Обратите внимание

Не каждый интерфейс прост в реализации

Интерфейс предназначен для объявления любой структуры, которая может существовать в JavaScript.

Рассмотрим следующий пример, где что-то можно вызвать с помощью new:

Вы могли бы иметь такой код:

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

Last updated

Was this helpful?