В чем разница между

Когда я работал над проектом Typescript, некоторые разработчики использовали interfaces, а другие — types. Тем не менее я пытался использовать интерфейсы и типы. Первое время я растерялся, потому что они очень похожи. Итак, что я должен использовать интерфейсы или типы?

Если вы запутались или не знаете, в чем разница, давайте поговорим о лучших практиках в разных случаях.

Типы против интерфейсов

Прежде чем мы начнем, давайте посмотрим, что такое интерфейс и тип.

Интерфейс — это полезный инструмент на этапе разработки, который действует как контракт в вашем приложении или синтаксис, которому должны следовать классы. Интерфейс также известен как утиная печать или подтипирование. Если вам интересно, вы можете прочитать больше в другой моей статье Когда и как использовать интерфейсы и классы в TypeScript.

Типы или псевдонимы типов — это что-то вроде интерфейса, создающего новое имя для любого типа. Обратите внимание, он не определяет новый тип.

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

примитивы

Примитивы могут использоваться только types.

type AppName = string
type AppType = string
type AppSize = number

Мы не можем создать их через interfaces. Итак, это первое различие между ними.

Союзы

Союзы — это переменная, которая может хранить несколько типов значений. Мы можем создавать союзы через types.

// AppName - string or undefined
type AppName = string | undefined
type AppType = 'mobile' | 'web' | 'desktop'
type AppSize = number | bigint

Кроме того, мы можем создать новый союз Employee двумя типами:

type Developer = {
  devName: string
}
type Tester = {
  testerName: string
}
type Employee = Developer | Tester

Давайте определим тип, который объединяет два интерфейса:

interface Developer {
  devName: string
}
interface Tester {
  testerName: string
}
type Employee = Developer | Tester

Интерфейс не поддерживает объединения.

Типы кортежей

Кортежи — это пара элементов с разным типом значений.

type App = [name: string, type: 'mobile' | 'web' | 'desktop']

Мы можем объявить кортеж, используя interface. Но непонятно по сравнению с type. Я предпочитаю использовать типы.

interface AppInfo {
  value: [name: string, type: 'mobile' | 'web' | 'desktop']
}

Функции

Мы можем определить функции, используя types и interfaces:

type runApp = () => void

Однако использование interface кажется сложным:

interface runApp {
  (): void
}

Слияние деклараций

Слияние объявлений — это когда TypeScript компилирует и объединяет два или более интерфейса с одинаковыми именами в одно объявление. Давайте определим два интерфейса App:

interface App {
  name: string
}
interface App {
  type: 'mobile' | 'web' | 'desktop'
}
// TypeScript will automatically merge both App declarations into one
const app: App = {
  name: 'facebook',
  type: 'mobile'
}

Если мы попытаемся объявить два типа App via, это выдаст ошибку. Потому что это не работает с types.

// error - Duplicate identifier 'App'.
type App {
  name: string
}
// error - Duplicate identifier 'App'.
type App {
  type: 'mobile' | 'web' | 'desktop'
}

Перекресток

Пересечение объединяет несколько типов в один тип с помощью ключевого слова &.

interface Developer {
  devName: string
}
interface Tester {
  testerName: string
}
type Employee = Developer & Tester

Но он не объединяет несколько типов в один интерфейс.

Наследование

Наследование — это возможность наследовать атрибуты и методы от родителя. Этого можно добиться только с помощью interfaces. Это невозможно с types.

interface Developer {
  devName: string
}
interface Tester {
  testerName: string
}
interface Employee extends Developer, Tester {}
class User implements Employee {
  devName = "Dev Name"
  testerName = "Tester Name"
}

Заключение

В этой статье мы обсудили основные различия между типами и интерфейсами. Они очень похожи, но то, что вы должны использовать, зависит от вашего варианта использования.

Спасибо за прочтение — надеюсь, эта статья оказалась вам полезной. Удачного кодирования!

Ресурсы