Я предполагаю, что вы уже знаете, что TypeScript — это разновидность JavaScript.
В этой статье предполагается, что вы более или менее знакомы с обоими. Однако я начну с краткого введения в TypeScript.
По сути, TypeScript — это JavaScript с добавленным синтаксисом для типов. W3Schools определяет TypeScript как синтаксическую надстройку JavaScript, которая добавляет статическую типизацию. В основном это означает, что TypeScript добавляет синтаксис поверх JavaScript, позволяя разработчикам добавлять типы.
Примитивные типы TypeScript
Ниже приведены основные примитивные типы в TypeScript:
boolean —истинные или ложные значения.
число —целые числа и значения с плавающей запятой.
строка —текстовые значения, заключенные в кавычки. например "TypeScript is Awesome"
any — отключает проверку типов и позволяет использовать все типы.
неизвестно — аналогична любой, но более безопасная альтернатива
никогда — эффективно выдает ошибку всякий раз, когда она определена.
Вы, должно быть, заметили двусмысленность между описаниями типов any
и unknown
выше. Это подводит нас к сути нашей сегодняшней дискуссии.
Разница между типами «любой» и «неизвестный»
Я представлю два основных отличия между any
и unknown
- TypeScript заставляет нас определить тип значения
unknown
, прежде чем мы сможем работать с ним, но не со значениемany
.
Пример:
let anyValue: any = 1; let unknownValue: unknown = 1; anyValue.helloworld(); // No error unknownValue.helloWorld(); // we get a TypeScript error
2. Мы не можем присвоить unknown
ничему, кроме себя или any
, а any
можем присвоить чему угодно.
Пример:
let anyValue: any = 1; let unknownValue: unknown = 1; let str: string; str = anyValue; // No error str = unknownValue; // We get a TypeScript error
Как видите, эти ограничения гарантируют, что мы проверяем значение unknown
перед работой с ним, что важно для уменьшения вероятности ошибок во время выполнения.
Рассмотрим несколько вариантов использования:
Сценарий использования 1 — описание неизвестного значения:
Мы можем использовать unknown
type для описания неизвестного нам значения. Например, значение, возвращенное из сетевого вызова:
let data: unknown = getSomeValueFromSomeWhere(); if (typeof data === 'string') { //data is a string. } else if (Array.isArray(data)) { //data is an array. } else if (typeof data === 'object') { //data is an object. }
Вариант использования 2 — в утверждении типа:
В TypeScript утверждение типа — это метод, который информирует компилятор о типе переменной. Утверждение типа похоже на приведение типов, но оно не реконструирует код. Мы можем использовать утверждение типа, чтобы указать тип значения и сказать компилятору, чтобы он не выводил его.
Однако мы не можем просто утверждать, что значение может иметь любой желаемый тип. Мы не можем утверждать, что тип значения не совпадает с фактическим типом значения.
Пример:
let value = '1' as number; // Error, we can't say that a string is a number interface Vehicle { name: string; model: string; } function buyVehicle(vehicle: Vehicle){} buyVehicle({niceVehicle: ''} as Vehicle); // Error, this object doesn't have the required properties of the Vehicle interface.
Обходной путь для подтверждения того, что значение имеет тип, который не перекрывается с фактическим типом значения, состоит в том, чтобы сначала утверждать, что значение неизвестно:
buyVehicle({niceVehicle: ''} as unknown as Vehicle)
Однако нам следует избегать этого обходного пути, потому что он просто делает наш код небезопасным.
Заключение
Типы any
и unknown
— это два примитивных типа в TypeScript, которые иногда могут пригодиться.
any
может быть полезным способом получить прошлые ошибки, поскольку он отключает проверку типов, но TypeScript не сможет обеспечить безопасность типов, а инструменты, которые полагаются на данные типа, такие как автозаполнение, не будут работать.
unknown
лучше всего использовать, когда мы не знаем тип вводимых данных. Чтобы добавить тип позже, нам нужно будет привести его.
Примечание: нам следует избегать использования any
, насколько это возможно.
— -
Надеюсь, вы найдете эту статью интересной, и если вы это сделаете, пожалуйста, оставьте пару аплодисментов и не забудьте подписаться на меня, если вы еще этого не сделали, чтобы вы могли получать более классный контент каждый раз, когда я публикую. Спасибо.