Примитивные типы Number, String, Boolean, Symbol, BigInt
Преобразования TypeScript не затронуло ни один из перечисленных в заголовке тип. Но несмотря на это их упоминание необходимо, поскольку их отсутствие сделало бы картину менее точной.
Важно
Помимо того, что система типов TypeScript включает в себя все существующие в JavaScript типы данных, некоторые из них подверглись более очевидному уточнению.
Типы данных, чьи идентификаторы начинаются с прописной буквы (Type
), представляют объектные типы (ссылочные типы) описывающие одноимённые типы из JavaScript (Number
, String
, Boolean
и т.д.). Проще говоря типы знакомые по JavaScript и начинающиеся с большой буквы представляют конструкторы. В TypeScript подобные типы описаны с помощью глобальных интерфейсов (interface
) и помимо того, что их можно расширять (extends
) и реализовывать (implements
) их также можно указывать в аннотации типа. Но сразу стоит сделать акцент на том, что указывать их в аннотации следует только тогда, когда подразумевается именно конструктор. Для остальных случаев существуют типы идентификаторы которых начинаются со строчной буквы (type
). Имена типов начинающихся с маленькой буквы являются зарезервированными ключевыми словами и представляют литералы примитивных значений, то есть непосредственно числа, строки и другие значения. Данные типы предназначены для указания в аннотациях, а не для использования в механизмах, как например наследование или расширение.
Number (number) примитивный числовой тип
В TypeScript, как и в JavaScript, все производные от number
являются 64-битными числами двойной точности с плавающей запятой.
Помимо того, что в TypeScript существует тип Number
представляющий конструктор одноименного типа из JavaScript, также существует тип number
представляющий примитивные значения числовых литералов.
let v1: number; // v1: number явно let v2 = 5.6; // v2: number неявно
Напомню, что числа могут записываться в двоичной, восьмеричной, десятичной, шестнадцатеричной системе счисления.
let binary: number = 0b101; let octal: number = 0o5; let decimal: number = 5; let hex: number = 0x5;
Помимо этого тип number
неявно преобразуется в тип Number
, но не наоборот.
let n: number = 5; let N: Number = new Number(5); N = n; // Ok n = N; // Error -> Type 'Number' is not assignable to type 'number'.
В случаях когда тип не указан явно, а в качестве значения ожидается результат вызова конструктора, то вывод типов определяет принадлежность к типу конструктора только если конструктор был вызван при помощи оператора new
.
let v0 = Number(5); // let v0: number let v1 = new Number(5); // let v1: Number
В TypeScript поведение типа Number
идентично поведению одноимённого типа в JavaScript.
String (string) примитивный строковый тип
Примитивный тип String
представляет собой последовательность символов в кодировке Unicode UTF-16. Строки могут быть заключены в одинарные или двойные кавычки, а также в обратные апострофы (инициаторы так называемых шаблонных строк).
Помимо того, что в TypeScript существует тип String
описывающий одноименный конструктор из JavaScript, также существует тип string
представляющий примитивные значения строковых литералов.
let v1: string; // v1: string явно let v2 = 'Bird'; // v2: string неявно let v3: string = "Fish"; // v3: string явно let v4: string = `Animals: ${v2}, ${v3}.`; // v4: string явно
Тип string
неявно преобразуется в тип String
, но не наоборот.
let s: string = ""; let S: String = new String(""); S = s; // Ok s = S; // Error -> Type 'String' is not assignable to type 'string'.
И кроме этого вывод типов выводит принадлежность к типу конструктора только если он был вызван с помощью оператора new
.
let v0 = String(""); // let v0: string let v1 = new String(""); // let v1: String
В TypeScript поведение типа String
идентично поведению одноимённого типа в JavaScript.
Boolean (boolean) примитивный логический тип
Примитивный тип Boolean
является логическим типом и представлен значениями "истина" true
и "ложь" false
.
Помимо того, что в TypeScript существует тип Boolean
представляющий одноименный конструктор из JavaScript, также существует тип boolean
представляющий примитивные значения логических литералов.
let isV1Valid: boolean; // явно let isV2Valid = false; // неявно
Тип boolean
неявно преобразуется в тип Boolean
, что делает его совместимым с ним, но не наоборот.
let b: boolean = true; let B: Boolean = new Boolean(true); B = b; // Ok b = B; // Error -> Type 'Boolean' is not assignable to type 'boolean'.
И кроме этого вывод типов выводит принадлежность к типу конструктора только если он был вызван с помощью оператора new
.
let v0 = Boolean(""); // let v0: boolean let v1 = new Boolean(""); // let v1: Boolean
В TypeScript поведение типа Boolean
идентично поведению одноимённого типа в JavaScript.
Symbol (symbol) примитивный символьный тип
Примитивный тип Symbol
предоставляет уникальные идентификаторы, которые при желании могут использоваться в качестве индексируемых членов объекта.
Помимо того, что в TypeScript существует тип Symbol
описывающий одноименный конструктор из JavaScript, также существует тип symbol
, представляющий примитивные значения литералов.
let v1: symbol; // v1: symbol явно let v2 = Symbol('animal'); // v2: symbol неявно
Тип symbol
неявно преобразуется в тип Symbol
, что делает его совместимым с ним, но не наоборот.
let s: symbol = Symbol.for("key"); let S: Symbol = Symbol.for("key"); S = s; // Ok s = S; // Error -> Type 'Symbol' is not assignable to type 'symbol'.
Поскольку конструктор Symbol
нельзя вызвать с помощью оператора new
вывод типов всегда будет определять принадлежность к типу symbol
.
И кроме этого вывод типов выводит принадлежность к типу конструктора только если он был вызван с помощью оператора new
.
let v0 = Symbol(""); // let v0: symbol
Тип symbol
предназначен для аннотирования символьных литералов. В TypeScript, поведение типа Symbol
идентично поведению одноимённого типа в JavaScript.
BigInt (bigint) примитивный числовой тип
BigInt
— примитивный числовой тип позволяющий безопасно работать с числами произвольной точности, в том числе значениями выходящими за пределы установленные типом Number
. Примитивный тип BigInt
указывается с помощью ключевого слова bigint
.
let bigInt: bigint = BigInt(Number.MAX_VALUE) + BigInt(Number.MAX_VALUE);
Но стоит заметить, что на данный момент (конец 2018 года) из-за плохой поддержки типа BigInt
TypeScript позволяет работать с ним лишь при установленной опции компилятора --target
в значение ESNext
.
Тип bigint
предназначен для аннотирования числовых значений с произвольной точностью. В TypeScript поведение типа BigInt
идентично поведению одноимённого типа в JavaScript.