Typescript Глубокое Погружение
  • Typescript Глубокое Погружение
  • Typescript проект
    • Контекст компиляции
    • Пространство декларации
    • Модули
    • Пространства имен
    • Динамический импорт выражений
  • Typescript Система типов
    • Обзор
    • Миграция с JavaScript
    • @types
    • Декларация окружения
    • Интерфейсы
    • Перечисления
    • lib.d.ts
    • Функции
    • Подлежащий выкупу
    • Тип утверждения
    • Freshness
    • Тип защиты
    • Литеральный тип
    • readonly
    • Дженерики
    • Тип вывода
    • Тип совместимости
Powered by GitBook
On this page
  • Классы могут реализовывать интерфейсы
  • Обратите внимание
  • Не каждый интерфейс прост в реализации

Was this helpful?

  1. Typescript Система типов

Интерфейсы

Интерфейсы имеют нулевое влияние 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 для обеспечения совместимости:

interface Point {
  x: number;
  y: number;
}

class MyPoint implements Point {
  x: number;
  y: number; // Same as Point
}

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

interface Point {
  x: number;
  y: number;
  z: number; // New member
}

class MyPoint implements Point {
  // ERROR : missing member `z`
  x: number;
  y: number;
}

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

let foo: Point = new MyPoint();

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

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

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

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

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

interface Crazy {
  new (): {
    hello: number;
  };
}

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

class CrazyClass implements Crazy {
  constructor() {
    return { hello: 123 };
  }
}

// Because
const crazy = new CrazyClass(); // crazy would be { hello:123 }

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

PreviousДекларация окруженияNextПеречисления

Last updated 5 years ago

Was this helpful?