Автор оригинала: FreeCodeCamp Community Member.
TypeyScript – это один из инструментов, которые люди хотят учиться больше всего, согласно A Обзор переполнения стека 90 000 разработчиков.
ShameScript взорвался популярностью, размером сообщества и принятия за последние несколько лет. Сегодня даже Фейсбукский проект Facebook из Facebook движется в Typeycript Отказ
TypeScript – это статически напечатанная суперсета JavaScript, который стремится облегчить разработку больших приложений JavaScript. Это также знает как JavaScript, что весы Отказ
ПОЧЕМУ ИСПОЛЬЗУЙТЕ TEPSCRETS?
JavaScript развился намного за последние несколько лет. Это самый универсальный кроссплатформенный язык, используемый как для клиентской, так и для серверов.
Но JavaScript никогда не предназначался для такого масштабного развития приложений. Это динамический язык без системы типа, что означает, что переменная может иметь любой тип значения, такой как строка или логическое значение.
Системы типа увеличения качества кода, читабельность и облегчают сохранение и рефакторов кодовой базы. Что еще более важно, ошибки могут быть пойманы во время компиляции, а не во время выполнения.
Без системы типа трудно масштабировать JavaScript для создания сложных приложений с большими командами, работающими на одном и том же коде.
Tymdercript предоставляет гарантии между разными частями кода в момент компиляции. Ошибка компилятора, как правило, точно говорит вам, где что-то пошло не так, и то, что именно пошло не так, тогда как ошибка времени выполнения сопровождается трассировкой стека, который может вводить в заблуждение, и приводит к значительному количеству, потрачению на отладку.
Teamescript Prose.
- Уловить потенциальные ошибки ранее в цикле развития.
- Управляйте большими кодовыми базами.
- Легче рефакторинг.
- Упростить работу в командах – когда контракты в коде более сильнее, для разных разработчиков проще переходить и выходить из кодовой базы без непреднамеренного нарушения вещей.
- Документация – типы информируют какую-то документию, что ваше будущее, а также другие разработчики могут следовать.
Типписном наконечника
- Это что-то дополнительно учиться – Это компромисс между краткосрочным замедлением и долгосрочным улучшением эффективности и обслуживания.
- Тип ошибок может быть несовместимым.
- Конфигурация резко меняет свое поведение.
Логический
const isLoading: boolean = false;
Число
const decimal: number = 8; const binary: number = 0b110;
Нить
const fruit: string = "orange";
Множество
Типы массивов могут быть написаны одним из двух следующих способов:
// Most common let firstFivePrimes: number[] = [2, 3, 5, 7, 11]; // Less common. Uses generic types (more on that later) let firstFivePrimes2: Array= [2, 3, 5, 7, 11];
Корпус
Типы кортежей позволяют выразить организованный массив, в котором известно тип фиксированного количества элементов. Это означает, что вы получите ошибку
let contact: [string, number] = ['John', 954683]; contact = ['Ana', 842903, 'extra argument'] /* Error! Type '[string, number, string]' is not assignable to type '[string, number]'. */
Любой
любой
Совместим с любыми типовыми типами в системе типа, что означает, что для него ничего не может быть назначено, и его можно присвоить. Это дает вам возможность отказаться от проверки типа.
let variable: any = 'a string'; variable = 5; variable = false; variable.someRandomMethod(); /* Okay, someRandomMethod might exist at runtime. */
Пустота
пустота
это отсутствие какого-либо типа вообще. Он обычно используется в качестве возвращаемого типа функции, которая не возвращает значение.
function sayMyName(name: string): void { console.log(name); } sayMyName('Heisenberg');
Никогда
никогда не
Тип представляет тип значений, которые никогда не происходят. Например, никогда не
Тип возврата функции, которая всегда будет выбросить исключение или не достичь его конечной точки.
// throws an exception function error(message: string): never { throw new Error(message); } // unreachable end point function continuousProcess(): never { while (true) { // ... } }
Null и undefined
Оба undefined
и null
на самом деле есть свои собственные типы по имени undefined
и null
, соответственно. Много как пустота
, они не очень полезны самостоятельно, но они становятся полезными при использовании в видах союз (Больше на этом в немного)
type someProp = string | null | undefined;
Неизвестный
Tymdercript 3.0 знакомит неизвестный тип, который является безопасным аналогом типа любой
Отказ Что-нибудь назначено на Неизвестно
, но Неизвестно
не является назначенным для чего-либо, кроме самого себя и любой.
Операции не допускаются на Неизвестно
без предварительного утверждения или сужения до более конкретного типа.
type I1 = unknown & null; // null type I2 = unknown & string; // string type U1 = unknown | null; // unknown type U2 = unknown | string; // unknown
Тип псевдонима
Псевдоним типа предоставляет имена для аннотаций типа, позволяющие использовать его в нескольких местах. Они созданы, используя следующий синтаксис:
type Login = string;
Тип профсоюза
Teadercript позволяет нам использовать более одного типа данных для свойства. Это называется тип профсоюза.
type Password = string | number;
Тип пересечения
Типы пересечения являются типы, которые объединяют свойства всех типов участников.
interface Person { name: string; age: number; } interface Worker { companyId: string; } type Employee = Person & Worker; const bestOfTheMonth: Employee = { name: 'Peter' age: 39, companyId: '123456'
Интерфейсы похожи на контракт между вами и компилятором, в котором вы указываете в одном с именованном аннотации, именно то, какие свойства ожидать с соответствующими аннотациями типа. Side-Note: Интерфейсы имеют нулевое время выполнения js, он используется исключительно для проверки типа вспомогательный
- Вы можете объявить Необязательно свойства Маркировка тех, кто с
?
, что означает, что объекты интерфейса могут или не могут определять эти свойства. - Вы можете объявить Читайте только свойства , что означает, что, как только имущество присваивается значение, его нельзя изменить.
interface ICircle { readonly id: string; center: { x: number; y: number; }, radius: number; color?: string; // Optional property } const circle1: ICircle = { id: '001', center: { x: 0 }, radius: 8, }; /* Error! Property 'y' is missing in type '{ x: number; }' but required in type '{ x: number; y: number; }'. */ const circle2: ICircle = { id: '002', center: { x: 0, y: 0 }, radius: 8, } // Okay circle2.color = '#666'; // Okay circle2.id = '003'; /* Error! Cannot assign to 'id' because it is a read-only property. */
Расширение интерфейсов
Интерфейсы могут продлить один или несколько интерфейсов. Это делает письменные интерфейсы гибкими и многоразовыми.
interface ICircleWithArea extends ICircle { getArea: () => number; } const circle3: ICircleWithArea = { id: '003', center: { x: 0, y: 0 }, radius: 6, color: '#fff', getArea: function () { return (this.radius ** 2) * Math.PI; }, };
Реализация интерфейса
Класс, реализующий интерфейс, должен строго соответствовать структуре интерфейса.
interface IClock { currentTime: Date; setTime(d: Date): void; } class Clock implements IClock { currentTime: Date = new Date(); setTime(d: Date) { this.currentTime = d; } constructor(h: number, m: number) { } }
Enum
(или перечисление) – это способ организовать коллекцию связанных значений, которые могут быть числовыми или строковыми значениями.
enum CardSuit { Clubs, Diamonds, Hearts, Spades } let card = CardSuit.Clubs; card = "not a card suit"; /* Error! Type '"not a card suit"' is not assignable to type 'CardSuit'. */
Под капотом enums по умолчанию на основе номеров. Enum
Значения начинаются с нуля и приращения на 1 для каждого элемента.
Код JavaScript, сгенерированный нашим предыдущим примером:
var CardSuit; (function (CardSuit) { CardSuit[CardSuit["Clubs"] = 0] = "Clubs"; CardSuit[CardSuit["Diamonds"] = 1] = "Diamonds"; CardSuit[CardSuit["Hearts"] = 2] = "Hearts"; CardSuit[CardSuit["Spades"] = 3] = "Spades"; })(CardSuit || (CardSuit = {})); /** * Which results in the following object: * { * 0: "Clubs", * 1: "Diamonds", * 2: "Hearts", * 3: "Spades", * Clubs: 0, * Diamonds: 1, * Hearts: 2, * Spades: 3 * } */
В качестве альтернативы могут быть инициализированы строковыми значениями, которые являются более читаемым подходом.
enum SocialMedia { Facebook = 'FACEBOOK', Twitter = 'TWITTER', Instagram = 'INSTAGRAM', LinkedIn = 'LINKEDIN' }
Обратное отображение
Enum
Поддерживает обратное отображение, что означает, что мы можем получить доступ к значению элемента, а также имя участника из его значения. Возвращаясь к нашему примеру карт:
const clubsAsNumber: number = CardSuit.Clubs; // 3 const clubsAsString: string = CardSuit[0]; // 'Clubs'
Вы можете добавлять типы к каждому из параметров, а затем к самой функции, чтобы добавить тип возврата.
function add(x: number, y: number): number { return x + y; }
Функциональные перегрузки
Tymdercript позволяет объявить Функциональные перегрузки Отказ По сути, вы можете иметь несколько функций с тем же именем, но и различными типами параметров и тип возврата. Рассмотрим следующий пример:
function padding(a: number, b?: number, c?: number, d?: any) { if (b === undefined && c === undefined && d === undefined) { b = c = d = a; } else if (c === undefined && d === undefined) { c = a; d = b; } return { top: a, right: b, bottom: c, left: d }; }
Значение каждого параметра изменяется на основе того, сколько параметров передается в функцию. Более того, эта функция ожидает только один, два или четыре параметра. Чтобы создать функцию перегрузки, вы просто объявляете заголовок функции несколько раз. Последний заголовок функции – это тот, который на самом деле активен внутри Функциональное тело, но недоступно для внешнего мира.
function padding(all: number); function padding(topAndBottom: number, leftAndRight: number); function padding(top: number, right: number, bottom: number, left: number); function padding(a: number, b?: number, c?: number, d?: number) { if (b === undefined && c === undefined && d === undefined) { b = c = d = a; } else if (c === undefined && d === undefined) { c = a; d = b; } return { top: a, right: b, bottom: c, left: d }; } padding(1); // Okay padding(1,1); // Okay padding(1,1,1,1); // Okay padding(1,1,1); /* Error! No overload expects 3 arguments, but overloads do exist that expect either 2 or 4 arguments. */
Вы можете добавить типы для свойств и аргументов метода
class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } greet(name: string) { return `Hi ${name}, ${this.greeting}`; } }
Модификаторы доступа
Teamscripts поддерживает публичный
, Частный
, защищены
Модификаторы, которые определяют доступность класса члена.
- А
публичный
Участник работает так же, как простые пользователи JavaScript и является модификатором по умолчанию. - А
Частный
Участник не может быть доступен из-за пределов его содержащего класса. - А
защищены
Член отличается от частного, поскольку он также может быть доступен в получении классов.
| Accessible on | public | protected | private | | :------------- | :----: | :-------: | :-----: | | class | yes | yes | yes | | class children | yes | yes | no | | class instance | yes | no | no |
Readonly модификатор
А readly
Собственность должна быть инициализирована в их декларации или в конструкторе.
class Spider { readonly name: string; readonly numberOfLegs: number = 8; constructor (theName: string) { this.name = theName; } }
Свойства параметров
Свойства параметров Позволяет создавать и инициатировать член в одном месте. Они объявлены префиксом параметра конструктора с модификатором.
class Spider { readonly numberOfLegs: number = 8; constructor(readonly name: string) { } }
Абстрактный
Абстрактное ключевое слово может использоваться как для классов, так и для методов абстрактных классов.
- Абстрактные классы не может быть прямо создан. Они в основном для наследства, где класс, который расширяет абстрактный класс, должен определить все абстрактные методы.
- Абстрактные члены Не содержание реализации, таким образом, не может быть доступно напрямую доступ. Эти члены должны быть реализованы в детских классах (вроде как интерфейс)
TypeyScript позволяет переопределить его предполагаемые типы любым способом. Это используется, когда у вас лучше понимание типа переменного, чем компилятор самостоятельно.
const friend = {}; friend.name = 'John'; // Error! Property 'name' does not exist on type '{}' interface Person { name: string; age: number; } const person = {} as Person; person.name = 'John'; // Okay
Первоначально синтаксис для утверждения типа был <Тип>
let person ={};
Но это создало двусмысленность при использовании в JSX. Поэтому рекомендуется использовать как
вместо.
Утверждение типа обычно используется при миграции кода из JavaScript и может знать более точный тип переменной, чем то, что в настоящее время присваивается. Но утверждение может быть считается вредным.
Давайте посмотрим на интерфейс нашего человека из предыдущего примера. Вы заметили что-то не так? Если вы заметили отсутствующее свойство возраст Поздравляю! Компилятор может помочь вам предоставить автозаполнение для свойств человека, но не будет жаловаться, если упустить какие-либо свойства.
TypeyScript Infery Типы переменных Когда в виде типа аннотаций отсутствует явная информация.
/** * Variable definitinon */ let a = "some string"; let b = 1; a = b; // Error! Type 'number' is not assignable to type 'string'. // In case of complex objects, TypeScript looks for the most common type // to infer the type of the object. const arr = [0, 1, false, true]; // (number | boolean)[] /** * Function return types */ function sum(x: number, y: number) { return x + y; // infer to return a number }
Совместимость типа основан на структурной печати, который относится к типы, основанные исключительно на своих членах.
Основное правило для структурного типа заключается в том, что х
совместим с y
Если y
имеет по крайней мере те же члены, что и х
Отказ
interface Person { name: string; } let x: Person; // Okay, despite not being an implementation of the Person interface let y = { name: 'John', age: 20 }; // type { name: string; age: number } x = y; // Please note that x is still of type Person. // In the following example, the compiler will show an error message as it does not // expect the property age in Person but the result will be as expected: console.log(x.age); // 20
Как y
имеет член Имя: строка
, это соответствовало необходимым свойствам для интерфейса человека, что означает, что х
это подтип y
Отказ Таким образом, назначение разрешено.
Функции
Количество аргументов В связи с функцией вы должны пройти хотя бы достаточно аргументов, что означает, что дополнительные аргументы не приведут никаких ошибок.
function consoleName(person: Person) { console.log(person.name); } consoleName({ name: 'John' }); // Okay consoleName({ name: 'John', age: 20 }); // Extra argument still Okay
Тип возврата Тип возврата должен содержать как минимум достаточно данных.
let x = () => ({name: 'John'}); let y = () => ({name: 'John', age: 20 }); x = y; // OK y = x; /* Error! Property 'age' is missing in type '{ name: string; }' but required in type '{ name: string; age: number; }' */
Гвардейцы типа позволяют сузить тип объекта в пределах условного блока.
тип
Используя TypeOf в условной блоке, компилятор узнает тип переменной, чтобы быть разными. В следующем примере TeampScript понимают, что за пределами условного блока х
может быть логическим и функцией Тофикс
не может быть вызвано на нем.
function example(x: number | boolean) { if (typeof x === 'number') { return x.toFixed(2); } return x.toFixed(2); // Error! Property 'toFixed' does not exist on type 'boolean'. }
экземпляр
class MyResponse { header = 'header example'; result = 'result example'; // ... } class MyError { header = 'header example'; message = 'message example'; // ... } function example(x: MyResponse | MyError) { if (x instanceof MyResponse) { console.log(x.message); // Error! Property 'message' does not exist on type 'MyResponse'. console.log(x.result); // Okay } else { // TypeScript knows this must be MyError console.log(x.message); // Okay console.log(x.result); // Error! Property 'result' does not exist on type 'MyError'. } }
в
в
Оператор проверяет существование свойства на объекте.
interface Person { name: string; age: number; } const person: Person = { name: 'John', age: 28, }; const checkForName = 'name' in person; // true
Литералы – это точный Значения, которые являются JavaScript примитивы. Они могут быть объединены в профсоюза типа для создания полезных абстракций.
type Orientation = 'landscape' | 'portrait'; function changeOrientation(x: Orientation) { // ... } changeOrientation('portrait'); // Okay changeOrientation('vertical'); /* Error! Argument of type '"vertical"' is not assignable to parameter of type 'Orientation'. */
Условные типы
Условный тип описывает тест на отношения типа и выбирает один из двух возможных типов, в зависимости от исхода этого теста.
type X = A extends B ? C : D;
Это означает, что если тип А
назначается на тип B
Тогда Х
такой же тип, как C
. Отказ В противном случае Х
такой же, как тип D;
Генеральный тип – это тип, который должен включать или ссылаться на другой тип, чтобы быть завершенным. Это обеспечивает осмысленные ограничения между различными переменными. В следующем примере функция возвращает массив того, что вы проходите.
function reverse(items: T[]): T[] { return items.reverse(); } reverse([1, 2, 3]); // number[] reverse([0, true]); // (number | boolean)[]
кейф
Keyof
Оператор запрашивает набор клавиш для данного типа.
interface Person { name: string; age: number; } type PersonKeys = keyof Person; // 'name' | 'age'
Сопоставлены типы
Сопоставленные типы позволяют создавать новые типы из существующих, отображающих типы свойств. Каждое свойство существующего типа преобразуется в соответствии с указанным правилом.
Частичный
type Partial= { [P in keyof T]?: T[P]; }
- Общий частичный тип определяется параметром одного типа
T
Отказ Keyof T
представляет союз всех имен свойствT
как строковые буквальные типы.[P в Keyof T]?: T [p]
обозначает, что тип каждого свойстваP
типаT
должно быть необязательным и преобразован вT [p]
ОтказT [p]
представляет тип свойстваP
типаT
Отказ
Retonly
Как мы находились в разрезе интерфейса, Tybrescript позволяет создавать более комментарий свойства. Есть Readly
Тип, который принимает тип T
и устанавливает все свои свойства так, как отреади.
type Readonly= { readonly [P in keyof T]: T[P]; };
Исключать
Исключить
Позволяет удалить определенные типы из другого типа. Исключить
от T
все, что требуется для T
Отказ
/** * type Exclude= T extends U ? never : T; */ type User = { _id: number; name: string; email: string; created: number; }; type UserNoMeta = Exclude
Выбирать
Выберите
Позволяет выбрать определенные типы из другого типа. Выберите
от T
все, что требуется для T
Отказ
/** * type Pick= { * [P in K]: T[P]; * }; */ type UserNoMeta = Pick
вывод
Вы можете использовать вывести
Ключевое слово для вывода вариабельной переменной в расширяется
пункт условного типа. Такая переменная предполагаемого типа может использоваться только в истинной ветви условного типа.
Returntype.
Получает возвратный тип функции.
/** * Original TypeScript's ReturnType * type ReturnTypeany> = T extends (...args: any) => infer R ? R : any; */ type MyReturnType = T extends (...args: any) => infer R ? R : any; type TypeFromInfer = MyReturnType<() => number>; // number type TypeFromFallback = MyReturnType ; // any
Давайте сломаемся Myreturntype
:
- Тип возврата
T
является … - Прежде всего, это
T
функция? - Если это так, то тип разрешается к предположенному типу возврата
R
Отказ - В противном случае тип решает
любой
Отказ
https://basarat.gitbooks.io/typescript/
https://www.typescriptlang.org/docs/home.html
https://www.tutorialsteacher.com/typescript
https://github.com/dzharii/awesome-typescript
https://github.com/typescript-cheatsheets/react-typescript-cheatsheet
Для того, чтобы учиться и придать текстуру, попробуйте, я создал простое приложение CommentConverter, используя TS и React-National с крючками. Вы можете проверить этот проект здесь Отказ
Спасибо и поздравляю для чтения до этого момента! Если у вас есть какие-либо мысли об этом, не стесняйтесь оставить комментарий.
Вы можете найти меня на Twitter Отказ