1. Предисловие ✍️
- мы все знаем,
JavaScript
Это очень гибкий язык программирования, и эта гибкость делает его, с одной стороны, самым популярным языком программирования, но также приводит к неравномерному качеству кода, высоким затратам на обслуживание и множеству ошибок во время выполнения. -
TypeScript
добавленсистема типовизJavaScript
,Подходит для любого размерас проект.TypeScript
изсистема типовво многом компенсируютJavaScript
Недостатки. - Система типов классифицируется по «времени проверки типа», которые можно разделить надинамический типа такжестатический тип:
-
динамический типЭто означает, что проверка типов выполняется во время выполнения.Ошибки типов в этом языке часто приводят к ошибкам выполнения.Мы знакомы с
JavaScript
То есть он относится к динамическому типу, который является интерпретируемым языком и не имеет стадии компиляции. -
статический типЭто означает, что тип каждой переменной можно определить на этапе компиляции, а ошибки типа в этом языке часто приводят к синтаксическим ошибкам. из-за
TypeScript
Перед запуском его нужно скомпилировать какJavaScript
, а проверка типов выполняется на этапе компиляции, поэтомуTypeScript
принадлежатьстатический тип.
-
динамический типЭто означает, что проверка типов выполняется во время выполнения.Ошибки типов в этом языке часто приводят к ошибкам выполнения.Мы знакомы с
- Возможно, новички подумают, что использование
TypeScript
Необходимо написать дополнительный код, что снижает эффективность разработки. Чего они могут не знать, так это того, чтоTypeScript
Расширены функции редактора (IDE), включая завершение кода, подсказки интерфейса, переходы к определениям, рефакторинг кода и т. д., что значительно повышает эффективность разработки.TypeScript
Система типов может повысить удобство сопровождения и уменьшить количество ошибок в крупных проектах. - Чтобы улучшить качество разработки, ниже будет подробно рассказано, как использовать его в проекте.
TypeScript
.
2. Практика в проекте
2.1 Эффективно используйте аннотации типов
- мы можем пройти
/** */
Примечание формы даетTypeScript
Тип подсказки разметки:
- При наведении указателя мыши на место, где используется шрифт, в редакторе будут более подсказки:
2.2 Эффективно используйте расширение типа
-
TypeScript
Существует два способа определения типов в интерфейсе:interface
) и введите псевдонимы (type alias
). В следующем примере определены те же типы, за исключением синтаксиса:
- И интерфейсы, и псевдонимы типов могут быть расширены:
- Интерфейсы и псевдонимы типов не исключают друг друга, то есть интерфейсы могут расширять псевдонимы типов, а псевдонимы типов также могут расширять интерфейсы:
- TypeScript: Interfaces vs TypesРазница между интерфейсом и псевдонимом типа подробно описана в разделе и не будет здесь подробно рассматриваться.
- Когда выбирать интерфейсы и псевдонимы типов:
- Используется при определении общедоступного API (например, при редактировании библиотеки).
interface
, что позволяет пользователям удобно наследовать интерфейс; - При определении свойств компонента (
Props
) и статус (State
), рекомендуется использоватьtype
,потому чтоtype
более ограничительный; -
type
Типы нельзя редактировать дважды, в то время какinterface
Может быть продлен в любое время.
- Используется при определении общедоступного API (например, при редактировании библиотеки).
2.3 Эффективное использование декларационных документов
- Файл объявления должен начинаться с
.d.ts
является суффиксом. Вообще говоря,TypeScript
будет анализировать все элементы в проекте*.ts
файл и, следовательно, также содержит файлы, начинающиеся с.d.ts
Конец файла манифеста.
- если только
tsconfig.json
Конфигурация содержитtyping.d.ts
файл, потом все остальное*.ts
файл может получить определения типов в файле объявлений.
2.3.1 Документы-декларации третьих лиц
- когда в
TypeScript
При использовании сторонней библиотеки в проекте нам необходимо обратиться к ее файлу объявлений, чтобы получить соответствующее завершение кода, подсказки интерфейса и другие функции. - Для большинства сторонних библиотек сообщество определило для нас свои файлы объявлений, и мы можем загрузить и использовать их напрямую. Обычно рекомендуется использовать
@types
Унифицированное управление файлами объявлений сторонних библиотек,@types
Способ использования очень прост, непосредственно используйтеnpm
илиyarn
Установите соответствующий модуль объявлений. кlodash
Например:
2.3.2 Файл пользовательской декларации
- Когда сторонняя библиотека не предоставляет файл объявления, нам нужно написать файл объявления самостоятельно. к
antd-dayjs-webpack-plugin
Например, когда вconfig.ts
используется вantd-dayjs-webpack-plugin
, если редактор не найдет его файл объявления, произойдет следующая ошибка:
- когда мы используем
yarn add @types/antd-dayjs-webpack-plugin --dev
При попытке решить проблему получаю следующую ошибку:
- То есть файл объявления, относящийся к библиотеке, не может быть найден (можно найти вздесьИщите нужный вам файл декларации, если не можете найти, значит его нет).
- Чтобы решить сообщение об ошибке редактора, мы можем использовать другой предоставленный им метод: добавить файл, содержащий
declare module 'antd-dayjs-webpack-plugin';
новый файл декларации. Мы также можем не добавлять новые файлы, как было сказано ранее.typing.d.ts
Просто добавьте следующее:
глобальная переменная
- когда нам нужно
ts
файл с использованием того жеTypeScript
тип, обычная практика будет вconstant.ts
Объявите соответствующий тип в файле и поместите егоexport
выйти к другимts
документimport
Использование, несомненно, приведет к созданию большого количества громоздкого кода. - Как упоминалось ранее, пока
tsconfig.json
Конфигурация содержит наш пользовательский файл декларации*.d.ts
, определения типов в файле объявлений могут использоваться*.ts
файл получен. Таким образом, мы можем объединить несколькоts
Глобальный тип, который должен использовать файл, записан в файле объявления, и вам нужно использовать этот типts
файл не требуетсяimport
можно использовать напрямую.
Пространства имен
- В случае, когда объем кода велик, во избежание различных конфликтов имен переменных в пространство имен можно поместить функцию, класс, интерфейс и т.д. одного и того же модуля.
- существует
ts
Использование файла:
- из-заофициальная документацияСоответствующее содержание файла декларации было подробно представлено и не будет здесь подробно останавливаться, учащиеся, которым это необходимо, могут прочитать его самостоятельно.
2.4 Эффективно используйте новые функции JS, поддерживаемые TypeScript
2.4.1 Необязательная цепочка
-
Необязательная цепочка
?.
даES11(ES2020)
добавленные функции,TypeScript 3.7
Эта функция поддерживается.дополнительная цепочкаЭто может избавить нас от необходимости выполнять избыточные различные предварительные проверки при запросе объектов с несколькими уровнями:
- В противном случае перейдите непосредственно к
user.info.getAge()
легко попастьUncaught TypeError: Cannot read property...
. - использовалдополнительная цепочка, приведенный выше код станет:
-
дополнительная цепочка— это оператор, который проверяет существование свойства перед попыткой доступа к нему.
TypeScript
пытаясь получить доступuser.info
раньше попытаюсь получить доступuser
, только тогда, когдаuser
если неnull
ни одинundefined
Будет продолжать посещать вниз, еслиuser
Даnull
илиundefined
, то выражение возвращает сразуundefined
. - В настоящее время необязательная цепочка поддерживает следующие синтаксические операции:
2.4.2 Нулевой объединяющий оператор
-
Нулевой оператор объединения
??
даES12(ES2021)
добавленные функции,TypeScript 3.7
Эта функция поддерживается. Когда операнд слеваnull
илиundefined
Когда , возвращает свой правый операнд, в противном случае возвращает свой левый операнд.
- И логический оператор ИЛИ (
||
) разные,||
будет иметь левый операнд какfalsy
значение (например,''
или0
) возвращает правый операнд. То есть, если вы используете||
установить значения по умолчанию для некоторых переменных, вы можете столкнуться с неожиданным поведением:
2.5 Эффективно используйте модификаторы доступа
-
TypeScript
Определение класса позволяет использоватьprivate
,protected
а такжеpublic
Эти три модификатора доступа объявляют ограничения доступа к членам и проверяются во время компиляции:-
public
: общедоступный тип, к которому можно получить доступ внутри класса, подклассов и вне класса.Если модификатор не добавлен, этот уровень доступа используется по умолчанию; -
protected
: тип защиты, доступ к которому возможен внутри класса и подкласса, но не вне класса; -
private
: закрытый тип, доступный только внутри текущего класса.
-
- Если модификатор не добавлен, по умолчанию
public
Уровень доступа:
- Приведенный выше код может получитьTypeScript Playgroundв рабочем состоянии, в
JS
области, мы можем видеть сбежавшихPerson
Определение класса с удаленными модификаторами доступа:
- Это означает, что экранированный код
JS
Он может быть правильно выполнен в среде и не будет ограничен. Но в редакторе мы видимp.name
Оно помечено как ошибка, и вы можете навести указатель мыши, чтобы увидеть конкретное сообщение об ошибке. -
TypeScript
Расширяет более строгий синтаксис и использует LSP и компиляторы, чтобы помочь разработчикам всреда разработкиКак можно раньше выявляйте и решайте существующие или существующие проблемы. - Однако, как показано выше, библиотека JS, скомпилированная TS, не ограничивает использование конечных пользователей. То есть, если использовать
TypeScript
Напишите библиотеку, которая используетprivate
илиprotected
чтобы ограничить доступ к членам, в своих пользователях также используйтеTypeScript
не проблема, когда его пользователи используютJavaScript
, но не ограничивается ожиданиями.
Очевидно, ECMAScript был вдохновлен TypeScript, представил новый синтаксис определения класса в ES2015 и начал думать об ограничениях доступа к членам, и предложил схему, основанную на определении закрытого члена Symbol и замыкания, Конечно, эта схема не очень приемлема для использования. После 4 лет размышлений, проектирования и обсуждения, наконец, выпустили использование в ES2019.
#
номер для определения спецификации закрытых членов. Chrome 74+ и Node 12+ реализовали спецификацию этого определения частного члена.
- видно, даже если
TypeScript
имеютprivate
модификаторы доступа,#privateField
еще вTypeScript
имеет смысл существования.
2.6 Эффективно используйте сужение типа
-
TypeScript
Сужение типа отширокий типПеревести вузкий тип, который часто используется в сценариях, где обрабатываются переменные типа union. - существует
TypeScript
, есть много способов сузить тип переменной:- утверждение типа
- тип гвардии
- двойное утверждение
2.6.1 Утверждение типа
- Утверждения типа могут явно указывать
TypeScript
Подробный тип значения. Когда в некоторых случаях мы очень уверены в типе значения, даже сTypeScript
Выведенный тип несовместим, тогда мы можем использовать утверждение типа, синтаксис следующий:
- существует
tsx
грамматика(React
изjsx
грамматическийts
версия) должен использовать первый, т.е.值 as 类型
. В то же время, поскольку<>
С общим синтаксисом легко конфликтовать, поэтому при использовании утверждения типа рекомендуется использовать единообразно值 as 类型
такой синтаксис. - когда
TypeScript
Когда мы не уверены, какого типа переменная типа объединения, мыможет получить доступ только к свойствам или методам, которые являются общими для всех типов этого типа объединения.
- Иногда нам действительно нужно получить доступ к одному из свойств или методов, специфичных для типа, когда мы не уверены в типе, например:
- В приведенном выше примере получите
animal.swim
сообщит об ошибке, когда . На этом этапе вы можете использовать утверждения типа дляanimal
утверждать какFish
тип, вы можете разрешить доступanimal.swim
Сообщается об ошибке:
- Следует отметить, что утверждения типа могут только «обмануть»
TypeScript
компилятор, нельзя избежатьВремя выполненияошибка, вместо этого злоупотребляя утверждениями типаМожет вызвать ошибки времени выполнения:
-
TypeScript
Компилятор доверяет нашему утверждению, поэтому вызываетswim()
Нет ошибки компиляции, когдаCat
не наswim
метод приведет к ошибке во время выполнения. - 🏁: Будьте осторожны при использовании утверждений типа, старайтесь избегать вызова методов или ссылок на глубокие свойства после утверждений, чтобы уменьшить количество ненужных ошибок во время выполнения.
2.6.2 Типовые ограждения
- Типовые охранники бывают в основном следующими способами:
- typeof: используется для суждения
number
,string
,boolean
илиsymbol
четыре типа; - instanceof: используется для определения принадлежности экземпляра к классу
- in: используется для определения того, принадлежит ли свойство/метод объекту
- typeof: используется для суждения
typeof
- годный к употреблению
typeof
реализует сужение типа иnever
Свойства типа проверяются всесторонне, как показано в следующем коде:
- Видно, что в конце
else
Внутри ветки мы сужаем его доnever
изfoo
присвоить явно объявленномуnever
Переменные, если все логически правильно, то это должно уметь компилироваться и проходить. Но если однажды ваш коллега изменит егоFoo
тип:
- Однако он забыл изменить в то же время
controlFlowAnalysisWithNever
Поток управления в методе, на этот разelse
разветвленныйfoo
Тип будет сужен доboolean
тип, который не может быть присвоенnever
тип, будет сгенерирована ошибка компиляции. используяnever
Чтобы избежать появления вновь добавленных типов объединения без соответствующих реализаций, мы можем гарантировать, чтоcontrolFlowAnalysisWithNever
Пути всегда исчерпаныFoo
всех возможных типов, что гарантирует сохранность кода.
instanceof
- использовать
instanceof
Оператор сужает тип переменной:
in
- использовать
in
Проведите проверку недвижимости:
2.6.3 Двойное утверждение
- Когда мы хотим сделать утверждение типа для значения, нам нужно убедиться, что тип значения, выводимый редактором, перекрывается с новым типом, иначе мы не можем просто сделать утверждение типа, как показано в следующем примере:
- Нужно знать, что любой тип может быть утвержден как
any
,а такжеany
Можно утверждать, что он любого типа. - Если мы все еще хотим использовать этот тип, мы можем использовать двойное утверждение:
-
TypeScript 3.0
добавил новыйunknown
тип, который является более безопаснымany
копия. Все можно отметить какunknown
типа, ноunkonwn
Он должен быть назначен другим типам после оценки типа и условного контроля, и никакая операция не может быть выполнена до оценки типа и условного контроля. - Операция двойного утверждения в нашем примере выше неразумна, просто чтобы проиллюстрировать эффект двойного утверждения.
- 🏁:Никогда не используйте двойные утверждения без крайней необходимости.
- Давайте рассмотрим более распространенный сценарий использования: предположим, мы находимся в
TypeScript
В проекте аJavaScript
написанная библиотека, которая предоставляется через отдельный файл объявленийTypeScript
поддержку, то может быть ситуация:
-
method()
существует.d.ts
Тип параметра, объявленный вSomeType
, но поскольку файл объявления не обновляется вовремя, он фактически принимает другой тип параметра, напримерnull
.
- В этом случае вы можете использовать
unknown
тип для реализации входящегоnull
:
- Таким образом, проверка типов компилятора может пройти нормально.
2.7 Эффективно используйте постоянное перечисление
- Постоянное перечисление выполняется с помощью
const enum
Определенные типы перечисления:
- Разница между постоянным перечислением и обычным перечислением заключается в том, что первое будетудален во время компиляции, и не может содержать вычисляемых членов (то есть инициализаторы константных членов перечисления могут содержать только литеральные значения и другие вычисляемые значения перечисления).
- Результат компиляции приведенного выше примера:
- Если вычисляемый элемент включен, на этапе компиляции будет сообщено об ошибке:
- Значение обычного перечисления не вычисляется на этапе компиляции, а сохраняется до этапа выполнения программы.Давайте рассмотрим следующий пример:
- Результат компиляции приведенного выше примера:
- Как видите, когда нам не нужен объект, но нужно значение объекта, мы можем использовать постоянное перечисление, что позволяет избежать создания избыточного кода и косвенных ссылок во время компиляции.
2.8 Эффективно используйте расширенные типы
- Кроме
string
,number
,boolean
В дополнение к этому базовому типу мы также должны понимать некоторые дополнительные способы использования в объявлениях некоторых типов.
2.8.1 Индекс типа (keyof)
-
keyof
похожий наObject.keys
, используемый для получения типа объединения Key в интерфейсе:
2.8.2 Типовые ограничения (расширение)
-
TypeScript
серединаextends
Ключевые слова отличаются отClass
после использованияextends
Функция наследования обычно используется в дженериках, и ее основная функция заключается в ограничении дженериков:
-
extends
часто сkeyof
используются вместе, например, у нас естьgetValue
Метод специально используется для получения значения объекта, но объект не определен, мы можем использоватьextends
а такжеkeyof
Сделайте ограничения:
- Когда входящий объект не имеет
key
, редактор сообщит об ошибке.
2.8.3 Типовая карта (в)
-
in
Функция ключевого слова в основном заключается в отображении типов, обходе существующего интерфейса.key
Или перебирать типы союзов. со встроенным универсальным интерфейсомReadonly
Например, это реализовано следующим образом:
- Что он делает, так это делает все свойства интерфейса доступными только для чтения:
2.8.3 Тип условия (U ? X : Y)
- Правила синтаксиса для условных типов такие же, как и для троичных выражений, и часто используются в случаях, когда тип неясен:
- Вышеизложенное означает, что если
T
даU
Подмножество , является типомX
, иначе типY
. со встроенным универсальным интерфейсомExtract
Например, это реализовано следующим образом:
-
TypeScript
буду использоватьnever
Типы для представления состояний, которые не должны существовать. Вышеупомянутое означает, что если тип в T существует в U, вернуть его, в противном случае отбросить. - Предположим, у нас есть два класса с тремя публичными свойствами, которые можно передать через
Extract
Извлеките эти три общедоступных свойства:
2.8.4 Утилиты-дженерики
-
TypesScript
Существует множество встроенных универсальных инструментов, которые были представлены ранее.Readonly
,Extract
Оба встроенных дженерика находятся вTypeScript
Встроенныйlib.es5.d.ts
определены в , поэтому их можно использовать напрямую без каких-либо зависимостей.
- Поскольку исходный код может быть напрямую
lib.es5.d.ts
Как видно из файла, здесь он не будет подробно останавливаться, ниже описаны функции и методы использования нескольких распространенных парадигм инструментов. -
Exclude
Роль представленного ранееExtract
Наоборот, еслиT
введитеU
Если он не существует, вернуть, в противном случае отказаться.
-
Partial
Используется, чтобы сделать все свойства интерфейса необязательными:
-
Required
Эффект точно такой же, какPartial
Вместо этого измените все необязательные свойства в интерфейсе на обязательные:
-
Pick
В основном используется для извлечения некоторых свойств интерфейса:
-
Omit
Роль прямо противоположна Pick, в основном используется для удаления определенных свойств интерфейса:
3. Резюме 📝
-
TypeScript
Он очень мощный, расширяет функции редактора (IDE) и предоставляет такие возможности, как завершение кода, подсказки интерфейса, переход к определениям и рефакторинг кода. -
TypeScript
может иJavaScript
сосуществовать, а значитJavaScript
Проекты могут быть постепенно перенесены вTypeScript
. - В этой статье описывается
TypeScript
Несколько распространенных практик в проекте, надеюсь еще не трогалTypeScript
или вправоTypeScript
Друзья, кто еще не знаком с ним, спешите применить его на практике в проекте, и стремиться улучшить ремонтопригодность кода и счастье разработки 💪.