Typeof typescript что это
Перейти к содержимому

Typeof typescript что это

  • автор:

Typeof typescript что это

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

В TypeScript имеются следующие базовые типы:

  • boolean : логическое значение true или false
  • number : числовое значение
  • string : строки
  • Array : массивы
  • кортежи
  • Enum : перечисления
  • Any : произвольный тип
  • Symbol
  • null и undefined : соответствуют значениям null и undefined в javascript
  • Never : также представляет отсутствие значения и используется в качестве возвращаемого типа функций, которые генерируют или возвращают ошибку

Большинство из этих типов соотносятся с примитивными типами из JavaScript.

Для установки типа применяется знак двоеточия, после которого указывается название типа. Примеры создания переменных:

let x: number = 10; let hello: string = "hello world"; let isValid: boolean = true;

То есть в данном случае выражение let hello: string = «hello world» указывает, что переменная hello будет иметь тип string и значение hello world .

При этом если в коде мы потом захотим изменить тип, например:

let hello: string = "hello world"; hello = 23;

То в процессе компиляции компилятор TypeScript выдаст ошибку.

Вначале рассмотрим примитивные типы данных, которые есть в TypeScript.

boolean

Тип Boolean представляет логическое значение true или false:

let isEnabled: boolean = true; let isAlive: boolean = false; console.log(isEnabled); console.log(isAlive);

number

Тип number представляет числа, причем все числа в TypeScript, как и в JavaScript, являются числами с плавающей точкой. Поэтому с помощью данного типа можно определять как целые числа, так и числа с плавающей точкой:

let age: number = 36; let height: number = 1.68;

TS поддерживает двоичную, восьмеричную, десятичную и шестнадцатиричную записи чисел:

let decimal: number = 6; // шестнадцатиричная система let hex: number = 0xf00d; // 61453 в десятичной // двоичная система let binary: number = 0b1010; // 10 в десятичной // восьмиричная система let octal: number = 0o744; // 484 в десятичной console.log(decimal); console.log(hex); console.log(binary); console.log(octal);

string

String представляет строки. Как и в JavaScript, в TypeScript строки можно заключать в двойные, либо в одинарные кавычки:

let firstName: string = "Tom"; let lastName = 'Johns';

Кроме того, TypeScript поддерживает такую функциональность, как шаблоны строк , то есть мы можем задать шаблон в косых кавычках (`), как если бы мы писали обычную строку, и затем в саму строку можно встраивать разные выражения с помощью синтаксиса $ < expr >, где expr — это выражение. Например:

let firstName: string = "Tom"; let age: number = 28; let info: string = `Имя $ Возраст: $`; console.log(info); // Имя Tom Возраст: 28

Косые кавычки также можно применять для установки многострочного текста:

let sentence: string = `Hello World! Goob bye World!`;

bigint

Для представления очень больших чисел в TypeScript добавлен специальный тип bigint . Этот тип позволяет хранить числа больше, чем 2 53 — 1 — больше, чем позволяет тип number.

Есть два способа определения объекта этого типа. Первый способ — с помощью функции BigInt() :

const num1: bigint = BigInt(100); console.log(num1);

Второй способ — с помощью добавления символа n после числового значения:

const num2: bigint = 100n; console.log(num2);

Следует отметить, что этот тип — часть стандарта ES2020, поэтому при компиляции следует установить данный стандарт в качестве целевого через параметр target . Например, в файле tsconfig.json :

Выведение типа

Но можно в принципе и не указывать тип переменной. Например:

let hello = "hello world"; hello = 23;

В этом случае TypeScript автоматически выведет тип из присваемого данной переменной значения. Так, на первой строке компилятор TS увидит, что переменной hello присваивается строка, поэтому для нее будет использоваться тип string . Однако на второй строке опять же компилятор выдаст ошибку, поскольку hello переменной уже определен тип string. А новое значение предполагает тип number.

Тип any

Any описывает данные, тип которых может быть неизвестен на момент написания приложения.

let someVar: any = "hello"; console.log(someVar); // сейчас someVar - это string someVar = 20; console.log(someVar); // сейчас someVar - это number

Так как здесь применяется тип any , то данный код скомпилируется без ошибок, несмотря на смену строкового значения на числовое. И также мы можем объявлять массивы данного типа:

var someArray: any[] = [ 24, "Tom", false];

Если переменная определяется без значения и указания типа, и только впоследствии при работе программы ей присваивается значение, тогда считается, что она имеет тип any :

let x; // тип any x = 10; x = "hello";

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

Проверка типа

С помощью оператора typeof мы можем проверить тип переменной. Это может быть необходимо, когда мы хотим выполнить некоторые операции с переменной, но нам неизвестен ее точный тип (например, переменная представляет тип any). Данная функциональность еще называется type guards или защита типа:

let sum: any; sum = 1200; sum = "тысяча двести"; let result: number = sum / 12; console.log(result); // NaN - строку нельзя разделить на число

Переменная sum может хранит любое значение, однако деление может работать только с числами. Поэтому перед делением выполним проверку на тип:

let sum: any; sum = 1200; if (typeof sum === «number») < let result: number = sum / 12; console.log(result); >else

Оператор typeof возвращает тип значения. Например, выражение typeof sum в данном случае возращает «number», так как переменная sum представляет число.

Оператор typeof может возвращать следующие значения:

  • «string»
  • «number»
  • «bigint»
  • «boolean»
  • «symbol»
  • «undefined»
  • «object»
  • «function»

Оператор typeof

Оператор typeof позволяет определить тип параметра (число, строка, объект). Оператор возвращает строку, содержащую тип ( ‘number’ , ‘string’ , ‘object’ ).

Для null оператор возвращает ‘object’ (это признанная ошибка языка). Для функций оператор возвращает ‘function’ . Это сделано для удобства, так как типа ‘function’ не существует.

Синтаксис

У оператора typeof есть 2 синтаксиса (оба синтаксиса работают одинаково):

typeof параметр; typeof(параметр);

Пример

Давайте посмотрим, как typeof работает с числом:

В результате выполненного кода мы получим значение number :

Пример

Теперь давайте зададим в параметре строку:

typeof ‘str’;

Результат выполнения кода:

Пример

Теперь укажем в параметре булевое значение true :

typeof true;

Результат выполнения кода:

Пример

Давайте посмотрим какой тип у значения undefined :

typeof undefined;

После выполнения кода мы получим также undefined :

Пример

Теперь давайте узнаем тип пустого объекта:

Результат выполнения кода:

Пример

А теперь узнаем тип пустого массива:

В результате также получим ‘object’ :

Пример

Давайте узнаем тип значения null :

typeof null;

В результате также получим ‘object’ , что является признанной ошибкой языка:

Пример

Теперь определим тип пустой функции:

typeof function() <>;

После выполнения кода мы получим ‘function’ , несмотря на то, что такого типа не существует. Данная строка нужна для удобства пользователя при определении функции:

Пример

Напишем функцию, которая будет выводить только числа:

function printNumber(number) < if (typeof number === 'number') < console.log(number); >> printNumber(2); printNumber(‘str’); printNumber(3);

Смотрите также

  • функцию isNaN ,
    которая осуществляет проверку на NaN
  • функцию isFinite ,
    которая проверяет число на конечность

typeof

Оператор typeof возвращает строку, указывающую тип операнда.

Интерактивный пример

Синтаксис

Операнд следует за оператором typeof :

typeof operand

Параметры

operand является выражением, представляющим объект или примитив, тип которого должен быть возвращён.

Описание

В следующей таблице приведены возможные возвращаемые значения typeof . Дополнительная информация о типах и примитивах находится на странице структуры данных JavaScript.

Type Result
Undefined «undefined»
Null «object» (смотрите ниже)
Boolean «boolean»
Number «number»
String «string»
Symbol (новый тип из ECMAScript 2015) «symbol»
Host object (определено JS окружением) Зависит от реализации
Function object (реализует [[Call]] в терминах ECMA-262) «function»
Любой другой тип «object»

Примеры

// Числа typeof 37 === "number"; typeof 3.14 === "number"; typeof 42 === "number"; typeof Math.LN2 === "number"; typeof Infinity === "number"; typeof NaN === "number"; // несмотря на то, что это "Not-A-Number" (не число) typeof Number(1) === "number"; // никогда не используйте эту запись! // Строки typeof "" === "string"; typeof "bla" === "string"; typeof "1" === "string"; // обратите внимание, что число внутри строки всё равно имеет тип строки typeof typeof 1 === "string"; // typeof всегда вернёт в этом случае строку typeof String("abc") === "string"; // никогда не используйте эту запись! // Booleans typeof true === "boolean"; typeof false === "boolean"; typeof Boolean(true) === "boolean"; // никогда не используйте эту запись! // Символы typeof Symbol() === "symbol"; typeof Symbol("foo") === "symbol"; typeof Symbol.iterator === "symbol"; // Undefined typeof undefined === "undefined"; typeof declaredButUndefinedVariable === "undefined"; typeof undeclaredVariable === "undefined"; // Объекты typeof  a: 1 > === "object"; // используйте Array.isArray или Object.prototype.toString.call // чтобы различить обычные объекты и массивы typeof [1, 2, 4] === "object"; typeof new Date() === "object"; // То что ниже приводит к ошибкам и проблемам. Не используйте! typeof new Boolean(true) === "object"; typeof new Number(1) === "object"; typeof new String("abc") === "object"; // Функции typeof function () > === "function"; typeof class C > === "function"; typeof Math.sin === "function"; 

null

// Это было определено с рождения JavaScript typeof null === "object"; 

В первой реализации JavaScript значения были представлены парой тип тега и значение. Тип тега для объектов равнялся 0. null был представлен как нулевой указатель (0x00 в большинстве платформ). Следовательно, тип тега для null равнялся нулю, поэтому возвращаемое значение typeof является фиктивным. (подробнее)

Исправление было предложено в ECMAScript (через отключение), но было отклонено. Это привело бы к тому, что typeof null === ‘null’ .

Использование оператора new

// Все функции-конструкторы, созданные с помощью 'new', будут иметь тип 'object' var str = new String("String"); var num = new Number(100); typeof str; // Вернёт 'object' typeof num; // Вернёт 'object' // Но существует исключение для конструктора Function var func = new Function(); typeof func; // Вернёт 'function' 

Регулярные выражения

Вызываемые регулярные выражения были нестандартным дополнением в некоторых браузерах.

typeof /s/ === "function"; // Chrome 1-12 Не соответствует ECMAScript 5.1 typeof /s/ === "object"; // Firefox 5+ Соответствует ECMAScript 5.1 

Ошибки, связанные с временными мёртвыми зонами

До ECMAScript 2015, гарантировалось, что оператор typeof вернёт строку для любого операнда, с которым он был вызван. Это изменилось после добавления не поднимающихся объявлений let and const с блочной областью видимости. Теперь, если переменные объявлены с помощью let и const , и для них вызывается typeof в блоке объявления переменных, но до объявления, то выбрасывается ReferenceError . Поведение отличается от необъявленных переменных, для которых typeof вернёт ‘undefined’. Переменные с блочной областью видимости находятся в «временной мёртвой зоне», которая длится от начала блока до момента объявления переменных. В этой зоне попытка доступа к переменным выбрасывает исключение.

typeof undeclaredVariable === "undefined"; typeof newLetVariable; let newLetVariable; // ReferenceError typeof newConstVariable; const newConstVariable = "hello"; // ReferenceError 

Исключения

Во всех текущих браузерах существует нестандартный host-объект document.all , который имеет тип Undefined.

typeof document.all === "undefined"; 

Хотя спецификация разрешает собственные имена типов для нестандартных экзотических объектов, требуется чтобы эти имена отличались от предопределённых. Ситуация, когда document.all имеет тип undefined должна рассматриваться как исключительное нарушение правил.

Спецификации

Specification
ECMAScript Language Specification
# sec-typeof-operator

Совместимость с браузерами

BCD tables only load in the browser

IE-специфичные замечания

В IE 6, 7 и 8 многие host-объекты являются объектами, но не функциями. Например:

typeof alert === "object"; 

Смотрите также

  • instanceof
  • Why typeof is no longer «safe»

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 7 авг. 2023 г. by MDN contributors.

Your blueprint for a better internet.

MDN

Support

  • Product help
  • Report an issue

Our communities

Developers

  • Web Technologies
  • Learn Web Development
  • MDN Plus
  • Hacks Blog
  • Website Privacy Notice
  • Cookies
  • Legal
  • Community Participation Guidelines

Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.

Тип оператора типа

JavaScript уже имеет оператор typeof , который вы можете использовать в контексте выражения:

// Печатает "строку" console.log(typeof "Hello world");

TypeScript добавляет оператор typeof , который можно использовать в контексте типа для ссылки на тип переменной или свойства:

let s = "hello"; let n: typeof s;

Это не очень полезно для базовых типов, но в сочетании с другими операторами типов вы можете использовать typeof для удобного выражения многих шаблонов. Для примера начнем с предопределенного типа ReturnType . Он принимает тип функции и возвращает тип возвращаемого значения:

type Predicate = (x: unknown) => boolean; type K = ReturnTypePredicate>;

Если мы попытаемся использовать ReturnType в имени функции, мы увидим поучительную ошибку:

function f() < return < x: 10, y: 3 >; > type P = ReturnType;

Помните, что значения и типы — это не одно и то же. Чтобы сослаться на тип, который имеет значение f , мы используем typeof :

function f() < return < x: 10, y: 3 >; > type P = ReturnTypetypeof f>;

Limitations

TypeScript намеренно ограничивает виды выражений, на которых можно использовать typeof .

В частности, использование typeof разрешено только для идентификаторов (имя переменных (i.e.) или их свойств. Это помогает избежать запутанной ловушки написания кода, который, по вашему мнению, выполняется, но на самом деле таковым не является:

// Предназначено для использования = ReturnType let shouldContinue: typeof msgbox("Are you sure you want to continue?");

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *