Перейти к содержанию

Базовый тип Any

То что TypeScript является типизированной надстройкой над JavaScript, от которой после компиляции не остаётся и следа, означает, что первый перенял от второго всю его идеологию. Одним из таких моментов является разделение типов данных на типы значения (примитивные) и ссылочные типы.

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

Any произвольный тип

Все типы в TypeScript являются подтипами any, который указывается с помощью ключевого слова any. Это означает, что он совместим в обе стороны с любым типом данных и с точки зрения системы типов является высшим типом (top type).

let apple: any = 0
apple = ''
apple = true

Тип any в аннотации рекомендуется применять только в самых крайних случаях. К примеру объявление неинициализированной переменной, с заранее неизвестным типом, что является допустимым сценарием на ранних стадиях применения техники TDD при создании программы. В остальных случаях настоятельно рекомендуется прежде всего рассматривать кандидатуру обобщенных типов, которые будут рассматриваться позднее.

Тип any позволяет работать со значением динамически, что не вызывает ошибок при обращении к членам не описанных в типе данных (незадекларированных), о которых анализатор TypeScript ничего не знает.

Примером этого может служить сервис, который работает с сервером посредством API. Полученные и сериализованные данные могут храниться как тип any прежде чем они будут и преобразованы к конкретному типу.

let data: any = JSON.parse('{"id": "abc"}')
let id = data.id // ок

Если при объявлении переменных var и let и полей, объявленных в теле класса, не было присвоено значение, компилятором будет выведен тип данных any.

var apple // apple: any
let lemon // lemon: any

class Fruit {
  name // name: any
}

То же правило касается и параметров функций.

function weight(fruit) {
  // fruit: any
}

Кроме того, если функция возвращает значение, принадлежащее к типу, который компилятор не в состоянии вывести, то возвращаемый этой функцией тип данных будет также будет выведен как тип any.

function sum(a, b) {
  // function sum(a: any, b: any): any
  return a + b
}

Тип any является уникальным для TypeScript, в JavaScript подобного типа не существует.

Итог

  • Тип данных any является супертипом для всех типов в TypeScript и указывается с помощью ключевого слова any.
  • Тип данных any указывается тогда, когда тип данных заранее неизвестен.
  • Тип данных any указывается только в самых крайних случаях.
  • Тип данных any позволяет обращаться к незадекларированным членам объектов, имитируя динамическое поведение, тем самым перекладывая ответственность за проверку реализации интерфейса на разработчика.