Назад | Учебник TypeScript | Вперёд
Содержание
Приведение к типу (Type assertion)
Введение
Лорды, сэры, пэры, дамы, Леди и баронессы, намедни я соизволил приступить к изучению TypeScript. Посему позвольте представить вам на людской суд переводную статью про базовые типы данных в TypeScript. Читатели, кои достаточно образованы, могут прочесть оригинал на английском языке.
Чтобы программы были полезными, нам нужно оперировать с некоторыми простыми порциями данных: числами, строками, структурами, логическими значениями и тому подобными. В TypeScript поддерживаются все типы JavaScript, а также удобный тип перечислений.
Boolean
Самый простой тип данных — логический тип со значениями true / false. В TypeScript он называется boolean, то есть так же как и в JavaScript.
1 |
let isDone: boolean = false; |
Number
Числа в TypeScript работают аналогично числам в JavaScript и имеют тип number. В дополнение к шестнадцатеричнодесятичным и десятичным литералам TypeScript поддерживает двоичные и восьмиричные литералы, которые были введены в ECMAScript 2015.
1 2 3 4 |
let decimal: number = 6; let hex: number = 0xf00d; let binary: number = 0b1010; let octal: number = 0o744; |
String
Для хранения строк TypeScript использует двойные " или одинарные ' для обрамления строк.
1 2 |
let color: string = "blue"; color = 'red'; |
Вы также можете использовать шаблоны строк, которые могут занимать несколько строк и содержать вычисляемые выражения внутри себя. Эти строки окружаются обратной кавычкой ` (которая на клавиатуре обычно расположена на клавише с буквой «ё»). Вычисляемые выражения внутри шаблонов строк пишутся в виде ${выражение}.
1 2 3 4 5 |
let fullName: string = `Bob Bobbington`; let age: number = 37; let sentence: string = `Hello, my name is ${ fullName }. I'll be ${ age + 1 } years old next month.`; |
Вышеприведённый код запишет в переменную sentence то же значение, что и вот такой:
1 2 |
let sentence: string = "Hello, my name is " + fullName + ".\n\n" + "I'll be " + (age + 1) + " years old next month."; |
Array
Массивы могут быть записаны двумя способами
В первом случае вы используете [], чтобы указать массив типов:
1 |
let list: number[] = [1, 2, 3]; |
Второй способ использует обобщённый тип массива, Array<elemType>:
1 |
let list: Array<number> = [1, 2, 3]; |
Tuple
Типы tuple позволяет вам создавать массив, где известны типы у определённого количества элементов, но требуется, чтобы эти типы были различны. Например, вы можете представить значение как пару string и number:
1 2 3 4 5 6 |
// Объявляем тип tuple let x: [string, number]; // Инициализируем его x = ["hello", 10]; // OK // Инициализируем его корректно x = [10, "hello"]; // Error |
При обращении к элементу по известному индексу мы получаем корректный тип:
1 2 |
console.log(x[0].substr(1)); // OK console.log(x[1].substr(1)); // Error, 'number' does not have 'substr' |
При обращении к элементу за пределами известного множества индексов мы получаем объединённый тип (union type).
1 2 3 4 5 |
x[3] = "world"; // OK, 'string' может быть присвоен к 'string | number' console.log(x[5].toString()); // OK, 'string' и 'number' оба имеют 'toString' x[6] = true; // Ошибка, 'boolean' это не 'string | number' |
Перечисления (enum)
Перечисление или enum — это полезное дополнение к множеству типов JavaScript. Перечисление — это способ дать более понятные имена множеству числовых значений.
1 2 |
enum Color {Red, Green, Blue} let c: Color = Color.Green; |
По умолчанию перечисления начинают нумерацию своих элементов с нуля. Это можно поменять, если указать вручную значение для какого-нибудь из элементов. Например, в предыдущем примере мы можем начать нумерацию с 1 вместо 0.
1 2 |
enum Color {Red = 1, Green, Blue} let c: Color = Color.Green; |
Или даже указать вручную все значения в перечислении:
1 2 |
enum Color {Red = 1, Green = 2, Blue = 4} let c: Color = Color.Green; |
Одно из полезных свойств перечислений — это то, что вы можете преобразовывать числовые значения в название из перечисления. Например, у нас есть число 2, но мы точно не знаем, что привязано к этому значению в перечислении Color, тогда мы можем узнать название элемента перечисления по этому индексу так:
1 2 3 4 |
enum Color {Red = 1, Green, Blue} let colorName: string = Color[2]; alert(colorName); |
Any
Иногда бывает необходимо объявить переменные, тип которых нам неизвестен во время написания приложения. Эти переменные могут хранить разные значения, например от пользователя или от сторонней библиотеки. В этих случаях бывает полезно отключить для них проверку типов на этапе компиляции. Для этого используется тип any:
1 2 3 |
let notSure: any = 4; notSure = "может быть, строка"; notSure = false; // ок, пусть будет логический тип boolean |
Тип any — мощный способ работать с существующим кодом JavaScript, позволяющий избежать проверки типов на этапе компиляции. Вы можете подумать, что Object делает то же самое, как он делает в других языках программирования, но переменные типа Object позволяют вам только присваивать произвольные значения, но вы не сможете вызвать произвольные методы для них, даже если они существуют:
1 2 3 4 5 6 7 8 |
let notSure: any = 4; notSure.ifItExists(); // okay, ifItExists может существовать // на этапе выполнения. notSure.toFixed(); // okay, toFixed существует // (но компилятор не проверяет) let prettySure: Object = 4; prettySure.toFixed(); // Ошибка: такого свойства нет у Object. |
Можно также объявлять массивы со значениями типа any:
1 2 3 |
let list: any[] = [1, true, "free"]; list[1] = 100; |
Void
Тип void несколько противоположен типу any, так как он обозначает отсутствие типа. Часто его используют для объявления функций, которые не возвращают никаких значений:
1 2 3 |
function warnUser(): void { alert("Это моё сообщение пользователю."); } |
Объявление переменных типа void обычно бесполезно, так как вы можете присвоить им только undefined и null:
1 |
let unusable: void = undefined; |
Null и Undefined
В TypeScript значения undefined и null имеют свои собственные типы: undefined и null. Они не особо полезны сами по себе:
1 2 3 |
// Ничего другого присвоить к этим переменным нельзя. let u: undefined = undefined; let n: null = null; |
По умолчанию типы null и undefined являются подтипами всех других типов, что означает, что вы можете присвоить null и undefined к чему-нибуть типа number.
Однако при использовании флага --strictNullChecks значения null и undefined можно присваивать только к void и соответствующим им типам. Это помогает избежать много частых ошибок. Когда вы хотите иметь возможность передавать и string, и null, и undefined, то вы можете использовать объединённый тип string | null | undefined. Про объединённые типы будет рассказано позже.
Примечание: мы советуем использовать флаг --strictNullChecks везде, где это возможно, но в этом учебнике мы будем полагать, что он отключён.
Never
Тип never представляет тип для значений, которые никогда не произойдут. Например, never — это тип возвращаемого значения для функции, которая всегда бросает исключение, или которая никогда не завершается. Переменные тоже могут получить тип never, которые ограничены такими ограничениями, которые никогда не примут значение true.
Тип never является подтипом любого типа и может быть присвоен любому типу. Однако никакой тип не является подтипом never и не может быть ему присвоен (кроме самого never). Даже any нельзя присвоить типу never.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Функция, возвращающая never, должна иметь // недостижимую точку окончания функции. function error(message: string): never { throw new Error(message); } // Выведенный тип результата never function fail() { return error("Something failed"); } // Функция, возвращающая never, должна иметь // недостижимую точку окончания функции. function infiniteLoop(): never { while (true) { } } |
Приведение к типу (Type assertion)
Иногда вы можете оказаться в ситуации, когда вы знаете о значении больше, чем знает TypeScript. Обычно это происходит, когда вы знаете, что тип какой-нибудь сущности может быть более специфичным, чем текущий.
Приведение к типу позволяет сказать компилятору: «Поверь мне, я знаю, что делаю.» Приведение к типу работает аналогично приведению/преобразованию к типу в других языках, но оно не осуществляет никаких проверок и преобразований данных. Оно не имеет никаких накладных расходов во время выполнения, так как оно используется исключительно компилятором.
Приведение к типу имеет две формы. Первая форма использует синтаксис угловых скобок:
1 2 3 |
let someValue: any = "это строка"; let strLength: number = (<string>someValue).length; |
Другая форма использует синтаксис as:
1 2 3 |
let someValue: any = "это строка"; let strLength: number = (someValue as string).length; |
Эти два примера эквивалентны. Использование первого или второго способа — это только вопрос предпочтений. Однако при использовании TypeScript в JSX разрешён только синтаксис as.
Замечание про let
Вы, наверное, уже заметили, что мы используем ключевое слово let вместо JavaScript-ового var, к которому вы, скорее всего, больше привыкли. Ключевое слово let — это новая конструкция JavaScript, которую делает доступной TypeScript. Позднее об этом будет рассказано более подробно, но огромное количество частых проблем JavaScript исключается при использовании let, поэтому вам следует использовать его вместо var везде, где это возможно.
Ссылки
Назад | Учебник TypeScript | Вперёд
серы => сэры
перы => пэры
Между прочим, некоторые из упомянутых в статье возможностей возможны и в нативном JS.
вот
Почему Леди с большой буквы?
Ты словно бесплатный корректор…