7 новых и интересных функций TypeScript — Блог о самом интересном.

От создателя: обзор функций, доступных в TypeScript v3.6 +, на которые вы непременно должны направить внимание.

Языковая группа TypeScript выпускает новейшие функции в необычном темпе без существенных суровых конфигураций. Как видно из недавнешнего опроса State of Javascript, это привело к все наиболее удачному принятию языка в обществе. В этом посте мы попытаемся обобщить более принципиальные функции. Мы выделим функции из последующих крайних выпусков:

Графики выпуска TypeScript

Примечание. До этого чем разглядывать тщательно какую-либо из этих функций, для вас следует посетить игровую площадку TypeScript, где вы сможете протестировать все функции. Я бы посоветовал переключиться на наиболее старенькую версию (кликните раскрывающийся перечень версий в верхнем левом углу), чтоб узреть, как наиболее новенькая версия обрабатывает сценарий использования, который не поддерживался ранее:

Демонстрация игровой площадки TypeScript

Совет: Используйте Bit (Github) для сотворения своей коллекции компонент пользовательского интерфейса. Это как библиотека компонент, лишь любой компонент имеет свои версии и устанавливается совсем независимо. Услаждайтесь резвой разработкой и согласованным пользовательским интерфейсом. Просто извлекайте повторно применяемые составляющие из приложений по ходу работы. Это так просто.

Bit поддерживает Javascript, TypeScript, React, React TypeScript, Angular и Vue.

1. Опциональные цепочки

Доступно в версии v3.7 и выше

Это настоящая неувязка, когда вы пытаетесь получить доступ к вложенным данным, чем больше вложенных данных, тем наиболее мучительным может стать ваш код.

В приведенном ниже примере, чтоб получить доступ к address, для вас необходимо пройти data.customer.address, и, может быть, что данные либо клиент имеют значение undefined. Обычно инспектируют, определен ли любой уровень этого обхода в сочетании с оператором && либо иными схожими приемами, как показано в примере.

Сейчас вы сможете применять для доступа к данным оператор опциональной цепочки «.?». Таковым образом, заместо сбоя во время выполнения, вложенная цепочка возвратит undefined в любом месте цепочки, если есть родитель (один из ближайших родственников человека, составляющий основу семьи), который еще не определен.

JavaScript // Prior to v3.7 if (data && data.customer && data.customer.address) { const {address} = data.customer const fullAddress = `${address.street}, ${address.city}, ${address.state }${address.zipcode}`

}

// v3.7 onwards

// data access const address = data?.customer?.address

const fullAddress = `${address?.street}, ${address?.city}, ${address?.state } ${address?.zipcode}`

// also works with arrays
customers?.[0]?.[‘address’]

// check if method defined and call
customer.approve?.()

1234567891011121314151617 // Prior to v3.7if (data && data.customer && data.customer.address) {   const {address} = data.customer   const fullAddress = `${address.street}, ${address.city}, ${address.state }${address.zipcode}`} // v3.7 onwards // data accessconst address = data?.customer?.addressconst fullAddress = `${address?.street}, ${address?.city}, ${address?.state } ${address?.zipcode}` // also works with arrayscustomers?.[0]?.[‘address’] // check if method defined and callcustomer.approve?.()

2. Нулевое коалесцирование

Доступно в версии v3.7 и выше

Оператор нулевого коалесцирования (??) является кандидатурой оператору OR (||). Возвращает выражение правой стороны, если слева – null либо undefined. Это различается от ||?|| на самом деле тем, что это является логическим оператором OR в JavaScript, и мы пытаемся применять куцее замыкание, чтоб возвратить 1-ое не неверное значение. Это может иметь неожиданные последствия, поэтому что число 0 либо пустая строчка будут рассматриваться, как false, когда это быть может допустимым вводом в качестве требования. Давайте проиллюстрируем это на примере:

JavaScript // Before passPhrase = data.inputString || ‘Unknown’ //will not accept «» (empty string) passCode = data.number || ‘-1111’ // will not accept 0

rememberMe = data.rememberFlag || true // will always be true!!!

// Now passPhrase = data.inputString ?? ‘Unknown’ //Unknown only if inputString is not defined passCode = data.number ?? ‘-1111’ // 0 could be a passCode

rememberMe = data.rememberFlag ?? true // false is a valid value

12345678910 // BeforepassPhrase = data.inputString || ‘Unknown’  //will not accept «» (empty string)passCode =  data.number || ‘-1111’ // will not accept 0 rememberMe = data.rememberFlag || true // will always be true!!!  // NowpassPhrase = data.inputString ?? ‘Unknown’  //Unknown only if inputString is not definedpassCode =  data.number ?? ‘-1111’ // 0 could be a passCoderememberMe = data.rememberFlag ?? true // false is a valid value

Таковым образом, мы можем совершенно точно провести различие меж кое-чем, что является undefined либо false (что быть может тяжело из-за того, как JavaScript принимает false).

3. Рекурсивные псевдонимы типа

Доступно в версии v3.7 и выше

Большая часть настоящих типов данных являются рекурсивными. К примеру, если вы пытаетесь работать с иерархическими данными, вы обнаружите повторяющиеся шаблоны данных такого же типа. Неплохим примером является JSON, который на самом деле является хеш-картой, и которая, в свою очередь, может содержать еще одну карту либо массив карт.

До версии 3.6, если для вас необходимо было найти обычный тип JSON, это обязано было смотреться приблизительно так:

Видео VK пользуются все большей популярностью среди пользователей

JavaScript [1] interface JSONObject { [x: string]: JSONValue; } [2] interface JSONArray extends Array { }

[3] type JSONValue = string | number | boolean | JSONObject | JSONArray

123 [1] interface JSONObject { [x: string]: JSONValue; }[2] interface JSONArray extends Array { }[3] type JSONValue = string | number | boolean | JSONObject | JSONArray

Если вы попытаетесь наложить типы в строчках 1 и 2 на 3 как одну строчку, вы сможете получить последующую ошибку: «Type alias JSONValue circularly references itself». Это было отлично принято решение в v3.7, и вы сможете написать это просто, как показано ниже:

JavaScript type JSONValue = string | number | boolean | { [x: string]: JSONValue } | Array

1 type JSONValue = string | number | boolean | { [x: string]: JSONValue } | Array

4. Подписи asserts

Доступно в версии v3.7 и выше

Вы должны знать, что в TypeScript есть средства защиты типов, которые в JavaScript отлично работают с операторами native typeof и instanceOf. Это помогает нам добавить подготовительные реквизиты к характеристикам функции, чтоб ограничить их определенными типами.

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

JavaScript function isDate(input: unknown) : asserts input is Date { if (input instanceof Date) return; else throw new Error(‘Input must be a Date!’);

}

function getYear(input: unknown) : number { isDate(input); return input.getFullYear() // TypeScripts knows that input is Date

}

console.log(getYear(new Date(‘2019-01-01’)));
console.log(getYear(‘2019-01-01’));

123456789101112131415 function isDate(input: unknown) : asserts input is Date {   if (input instanceof Date)     return;   else     throw new Error(‘Input must be a Date!’); }  function getYear(input: unknown) : number {   isDate(input);   return input.getFullYear()  // TypeScripts knows that input is Date }   console.log(getYear(new Date(‘2019-01-01’))); console.log(getYear(‘2019-01-01’));

Приведенный выше код смотрится отлично, но TypeScript все равно будет выдавать предупреждение «getFullYear is not available on unknown type».

Сейчас, начиная с v3.7, у TypeScript есть новое ключевое слово asserts, которое дозволит компилятору знать верный тип исходя из убеждений оператора контроля. Для функции заместо возвращаемого типа добавьте asserts as .

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

JavaScript function isDate(input: unknown) : asserts input is Date { if (input instanceof Date) return; else throw new Error(‘Input must be a Date!’);

}

function getYear(input: unknown) : number { isDate(input); return input.getFullYear() // TypeScripts knows that input is Date

}

console.log(getYear(new Date(‘2019-01-01’)));
console.log(getYear(‘2019-01-01’));

123456789101112131415 function isDate(input: unknown) : asserts input is Date {   if (input instanceof Date)     return;   else     throw new Error(‘Input must be a Date!’); }  function getYear(input: unknown) : number {   isDate(input);   return input.getFullYear()  // TypeScripts knows that input is Date }   console.log(getYear(new Date(‘2019-01-01’))); console.log(getYear(‘2019-01-01’));

5. Наилучшая оборотная связь для промисов

Усовершенствовано с версии 3.6

Всераспространенной ошибкой является попытка применять полезную нагрузку промисов конкретно в коде и запамятовать применять await либо then, как показано ниже:

JavaScript interface Customer { name: string phone: string

}

declare function getCustomerData(id: string): Promise;
declare function payCustomer(customer: Customer): void;

async function f() { const customer = getCustomerData(‘c1’) payCustomer(customer)

}

123456789101112 interface Customer {    name: string    phone: string} declare function getCustomerData(id: string): Promise;declare function payCustomer(customer: Customer): void; async function f() {    const customer = getCustomerData(‘c1’)    payCustomer(customer)}

TypeScript будет стопроцентно игнорировать промис и выведет сообщение о ошибке, не связанное с ним, как показано ниже:

Нет упоминания промиса

Начиная с версии 3.6, компилятор довольно умен, чтоб представить, что вы должны разрешить промис. Направьте внимание, как крайний компилятор обрабатывает ту же ошибку:

Давайте также коротко разглядим остальные достойные внимания функции, которые не требуют такового же уровня детализации:

6. Идентификаторы Unicode

Доступно с версии v3.6

Приведенный выше код не был бы скомпилирован в наиболее ранешних версиях TypeScript, но сейчас вы сможете определять идентификаторы из наиболее широкого набора Unicode.

7. Инкрементная компиляция

Доступна с версии 3.4

Если вы используете TypeScript для огромных баз кода, компилятору может потребоваться вечность, чтоб ответить на конфигурации, которые вы вносите в хоть какой из файлов в данной для нас базе кода. У нас есть новейший флаг —incremental, который вы сможете добавить в командную строчку tsc (компилятор текстов), и он будет равномерно составлять лишь те файлы, которые были изменены.

TypeScript делает это, сохраняя информацию о графе проекта с момента крайней компиляции в папке локального кэша снутри вашей базы кода. Для кодов React не забудьте верно настроить это при помощи Webpack либо Parcel, чтоб применять пошаговую компиляцию в конвейере сборки.

Надеюсь, что вы используете вышеперечисленные функции и не пропустите дорожную карту, чтоб быть в курсе функций, которые находятся в стадии разработки. Всего лучшего!

Создатель: RC

Редакция: Команда webformyself.

Источник

Вам также может понравиться