├── .gitignore ├── .editorconfig ├── answers ├── ts-js.md ├── general.md ├── syntax.md ├── advanced.md └── more.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | indent_style = tab 6 | indent_size = 2 7 | end_of_line = crlf 8 | charset = utf-8 9 | trim_trailing_whitespace = false 10 | insert_final_newline = false -------------------------------------------------------------------------------- /answers/ts-js.md: -------------------------------------------------------------------------------- 1 | ## Какое отношение TypeScript имеет к JavaScript? 2 | 3 | TypeScript - это надстройка JavaScript, которая компилируется в JavaScript. 4 | 5 | Все оригинальные библиотеки и синтаксис JavaScript по-прежнему работают, но TypeScript добавляет дополнительные параметры синтаксиса и функции компилятора, которых нет в JavaScript. 6 | 7 | ## Что такое JSX? 8 | 9 | JSX - это встраиваемый XML-подобный синтаксис, который позволяет создавать HTML. TypeScript поддерживает встраивание, проверку типов и компиляцию JSX непосредственно в JavaScript. 10 | 11 | ## Как компилировать TypeScript файл? 12 | 13 | Вам нужно вызвать компилятор TypeScript tsc для компиляции файла. Вам потребуется установить компилятор TypeScript, что можно сделать с помощью npm. 14 | 15 | ## Какие области видимости доступны в TypeScript? 16 | 17 | **Глобальная**: определяется вне любого класса и может использоваться в любом месте программы.
18 | **Область видимости функции / класса**: переменные, определенные в функции или классе, могут использоваться в любом месте в пределах этой области.
19 | **Локальная область действия / блок кода**: переменные, определенные в локальной области видимости, могут использоваться в любом месте этого блока. 20 | -------------------------------------------------------------------------------- /answers/general.md: -------------------------------------------------------------------------------- 1 | ## Каковы основные особенности TypeScript? 2 | 3 | - **Кроссплатформенность**: Компилятор TypeScript можно установить в любой операционной системе: Windows, macOS и Linux. 4 | - Объектно-ориентированный язык: TypeScript предоставляет все стандартные функции ООП, такие как классы, интерфейсы и модули. 5 | - **Статическая типизация**: TypeScript использует статическую типизацию и помогает проверять типы во время компиляции. Таким образом, вы можете обнаружить ошибки при написании кода без запуска скрипта. 6 | - **Необязательная статическая типизация**: TypeScript также допускает использование динамической типизации, если вы привыкли к ней в JavaScript. 7 | - **Манипуляции с DOM**: Вы можете использовать TypeScript для управления DOM для добавления или удаления элементов клиентской веб-страницы. 8 | 9 | ## В чем преимущества использования TypeScript? 10 | 11 | - TypeScript вносит порядок в код. 12 | - Проще дебажить код, т.к. ошибки видны до компиляции еще во время написания кода. 13 | - Статическая типизация TypeScript делает код более читабельным и структурированным чем JavaScript. 14 | - Возможность использования на разных платформах как в клиентских, так и в серверных проектах благодаря универсальной транспиляции. 15 | 16 | ## Какие типы данных встроены в TypeScript? 17 | 18 | **Number**: используется для представления значений чисел. Все числа в TypeScript хранятся как значения с плавающей запятой. 19 | 20 | **String**: представляет собой последовательность символов, хранящуюся как код Unicode UTF-16. Строки заключаются в одинарные или двойные кавычки. 21 | 22 | **Boolean**: логический тип данных. Имеет значение true или false. 23 | 24 | **Null**: Null представляет переменную, значение которой не определено. 25 | 26 | **Undefined**: литерал, который является отправной точкой всех переменных. 27 | 28 | **Void**: тип, присвоенный методам, не имеющим возвращаемого значения. 29 | 30 | ## Что такое интерфейс в TypeScript? 31 | 32 | Интерфейс определяет свойства и методы, которые объект должен реализовать. Другими словами, интерфейс - это определение кастомного типа данных, но без реализации. 33 | 34 | ```typescript 35 | interface IEmployee { 36 | empCode: number; 37 | empName: string; 38 | getSalary: (number) => number; // arrow function 39 | getManagerName(number): string; 40 | } 41 | ``` 42 | 43 | ## Что такое модуль в TypeScript? 44 | 45 | Модули в TypeScript - это набор связанных переменных, функций, классов и интерфейсов. 46 | 47 | Вы можете думать о модулях как о контейнерах, которые содержат все необходимое для выполнения задачи. Модули можно импортировать, чтобы легко обмениваться кодом между проектами. 48 | 49 | ## Как использовать TypeScript в backend? 50 | 51 | Вы можете использовать Node.js с TypeScript, чтобы использовать преимущества TypeScript. 52 | 53 | Просто установите компилятор TypeScript в свой Node.js, введя следующую команду: 54 | 55 | ```javascript 56 | npm i -g typescript 57 | ``` 58 | 59 | ## Что такое утверждение типа (type assertion) в TypeScript? 60 | 61 | Это процесс, который вынуждает компилятор пересмотреть свое отношение к типу данных 62 | 63 | Утверждение типа, похоже на преобразование (приведение) типов (type conversion, typecasting), за исключением того, что от них не остается и следа в скомпилированном коде, а внутренний механизм, различен. Именно поэтому они и называются утверждения. 64 | 65 | Утверждая тип, разработчик говорит компилятору - "поверь мне, я знаю, что делаю" (Trust me, I know what I'm doing). 66 | 67 | ## Что такое переопределение метода в TypeScript? 68 | 69 | Переопределение метода - это процесс, в котором методы базового класса переопределяются в дочернем классе. 70 | 71 | ```typescript 72 | class Person { 73 | doEat() { 74 | console.log("Person eats food."); 75 | } 76 | } 77 | 78 | class Employee extends Person { 79 | doEat() { 80 | console.log("Employee eats food."); 81 | } 82 | } 83 | 84 | let emp = new Employee(); 85 | emp.doEat(); // Output: Employee eats food. 86 | ``` 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Собеседование по TypeScript. Вопросы и ответы. 2 | 3 | ## Основы 4 | 5 | 1. Каковы основные особенности TypeScript?
6 | 2. В чем преимущества использования TypeScript?
7 | 3. Какие типы данных встроены в TypeScript?
8 | 4. Что такое интерфейс в TypeScript?
9 | 5. Что такое модуль в TypeScript?
10 | 6. Как использовать TypeScript в backend?
11 | 7. Что такое утверждение типа (type assertion) в TypeScript? 12 | 8. Что такое переопределение метода в TypeScript?
13 | 14 | ## Синтаксис и основы языка 15 | 16 | 1. Как объявить переменную в TypeScript?
17 | 2. Как вызвать конструктор базового класса из дочернего класса в TypeScript?
18 | 3. Объясните как использовать миксины в TypeScript.
19 | 4. Как проверить на null или undefined?
20 | 5. Что такое getters/setters? Как их использовать?
21 | 6. Как сделать так, чтобы классы, определенные в модуле, были доступны вне модуля?
22 | 7. Как преобразовать строку в число с помощью TypeScript?
23 | 8. Что такое файл .map? Зачем и как его можно использовать?
24 | 9. Что такое классы в TypeScript? 25 | 26 | ## TypeScript with JavaScript Questions 27 | 28 | 1. Какое отношение TypeScript имеет к JavaScript?
29 | 2. Что такое JSX?
30 | 3. Как компилировать TypeScript файл?
31 | 4. Какие области видимости доступны в TypeScript? 32 | 33 | ## Продвинутое знание TypeScript 34 | 35 | 1. Что такое стрелочные/лямбда функции?
36 | 2. Объясните Rest параметры и правила объявления таких параметров.
37 | 3. Что такое Triple-Slash директивы?
38 | 4. Что делает тип Omit?
39 | 5. Что такое перегрузка функции в TypeScript?
40 | 6. Как сделать все свойства интерфейса необязательными?
41 | 7. Когда нужно использовать ключевое слово unknown?
42 | 8. Что такое декораторы и к чему их можно применить?
43 | 9. Что такое тип awaited?
44 | 10. В чем разница между типами never и void?
45 | 11. В чем разница между implements и extends?
46 | 12. Что такое условные типы в TypeScript? 47 | 48 | ## Eщё вопросы по TypeScript 49 | 50 | 1. Назовите модификатор доступа по умолчанию?
51 | 2. Когда нужно использовать ключевое слово declare?
52 | 3. Что такое дженерики в TypeScript?
53 | 4. Как и когда нужно использовать enum?
54 | 5. Что такое пространство имен и как его использовать?
55 | 6. Как реализовать необязательные параметры?
56 | 7. TypeScript функциональный язык программирования?
57 | 8. Как с помощью TypeScript сделать переиспользуемые компоненты?
58 | 9. В чем разница между tuple и массивом в TypeScript?
59 | 10. В чем разница между внутренними и внешними модулями TypeScript?
60 | 11. Какие коллекции поддерживает TypeScript?
61 | 12. Для чего используется тип Record?
62 | 13. В чем преимущества TypeScript?
63 | 14. TypeScript поддерживает абстрактные классы?
64 | -------------------------------------------------------------------------------- /answers/syntax.md: -------------------------------------------------------------------------------- 1 | ## Как объявить переменную в TypeScript? 2 | 3 | Вы можете создавать переменные тремя способами: `var`, `let` и `const`. 4 | 5 | `var` - это старый стиль объявления переменных. 6 | 7 | `let` - это способ объявления переменных в TypeScript по умолчанию. По сравнению с `var` `let` уменьшает количество ошибок времени компиляции и повышает читаемость кода. 8 | 9 | ```typescript 10 | let num: number = 1; 11 | ``` 12 | 13 | `const` создает постоянную переменную, значение которой не может измениться. Он использует те же правила области видимости, что и let, и помогает снизить общую сложность программы. 14 | 15 | ```typescript 16 | const num: number = 100; 17 | ``` 18 | 19 | ## Как вызвать конструктор базового класса из дочернего класса в TypeScript? 20 | 21 | Вы можете использовать функцию `super()` для вызова конструктора базового класса. 22 | 23 | ```typescript 24 | class Animal { 25 | name: string; 26 | constructor(theName: string) { 27 | this.name = theName; 28 | } 29 | move(distanceInMeters: number = 0) { 30 | console.log(`${this.name} moved ${distanceInMeters}m.`); 31 | } 32 | } 33 | 34 | class Snake extends Animal { 35 | constructor(name: string) { 36 | super(name); 37 | } 38 | move(distanceInMeters = 5) { 39 | console.log("Slithering..."); 40 | super.move(distanceInMeters); 41 | } 42 | } 43 | ``` 44 | 45 | ## Объясните как использовать миксины в TypeScript. 46 | 47 | TypeScript, как и многие объектно-ориентированные языки, не позволяет использовать напрямую множественное наследование. Из-за этого, не смотря на то, что можно реализовать множество интерфейсов в классе, унаследовать его можно только от одного класса. 48 | Примесь – объект, содержащий методы и свойства для реализации конкретного функционала. 49 | Функциональность миксинов (mixins) частично позволяет унаследовать свойства и методы сразу двух и более классов, тем самым избавившись от дублирования в коде. 50 | 51 | ## Как проверить на null или undefined? 52 | 53 | Рекомендуется проверять `== null` как на `undefined`, так и `null`. 54 | Также Nullish Coalescing (оператор `??`) помогает проверить, является ли переменная `null` или `undefined`. 55 | С оператором `??` вместо длинной проверки 56 | 57 | ```typescript 58 | message = undefined; 59 | getMessage() { 60 | if (this.message !== null && this.message !== undefined) { 61 | return "default message"; 62 | } 63 | return this.message; 64 | } 65 | ``` 66 | 67 | можно написать так: 68 | 69 | ```typescript 70 | message = undefined; 71 | getMessage() { 72 | return this.message ?? 'Default message'; 73 | 74 | } 75 | ``` 76 | 77 | ## Что такое getters/setters? Как их использовать? 78 | 79 | Геттеры и сеттеры - это особые типы методов, которые помогают делегировать различные уровни доступа к частным переменным в зависимости от потребностей программы. 80 | 81 | Геттеры позволяют ссылаться на значение, но не могут его редактировать. Сеттеры позволяют изменять значение переменной, но не видеть ее текущее значение. Это важно для достижения инкапсуляции. 82 | 83 | Например, новый работодатель может получить количество сотрудников в компании, но не имеет разрешения устанавливать количество сотрудников. 84 | 85 | ```typescript 86 | const fullNameMaxLength = 10; 87 | 88 | class Employee { 89 | private _fullName: string = ""; 90 | 91 | get fullName(): string { 92 | return this._fullName; 93 | } 94 | 95 | set fullName(newName: string) { 96 | if (newName && newName.length > fullNameMaxLength) { 97 | throw new Error("fullName has a max length of " + fullNameMaxLength); 98 | } 99 | 100 | this._fullName = newName; 101 | } 102 | } 103 | 104 | let employee = new Employee(); 105 | employee.fullName = "Bob Smith"; 106 | 107 | if (employee.fullName) { 108 | console.log(employee.fullName); 109 | } 110 | ``` 111 | 112 | ## Как сделать так, чтобы классы, определенные в модуле, были доступны вне модуля? 113 | 114 | Вы можете использовать ключевое слово `export`, чтобы классы, определенные вне модуля. 115 | 116 | ```typescript 117 | module Admin { 118 | // use the export keyword in TypeScript to access the class outside 119 | export class Employee { 120 | constructor(name: string, email: string) {} 121 | } 122 | let alex = new Employee("alex", "alex@gmail.com"); 123 | } 124 | 125 | // The Admin variable will allow you to access the Employee class outside the module with the help of the export keyword in TypeScript 126 | let nick = new Admin.Employee("nick", "nick@yahoo.com"); 127 | ``` 128 | 129 | ## Как преобразовать строку в число с помощью TypeScript? 130 | 131 | Подобно JavaScript, вы можете использовать функции `parseInt` или `parseFloat` для преобразования строки в целое число или число с плавающей запятой соответственно. Вы также можете использовать унарный оператор `+` для преобразования строки в наиболее подходящий числовой тип, «3» становится целым числом 3, а «3.14» становится вещественным числом 3.14. 132 | 133 | ## Что такое файл .map? Зачем и как его можно использовать? 134 | 135 | Файл map - это исходная карта, которая показывает, как исходный код TypeScript был интерпретирован в пригодный для использования код JavaScript. Они помогают упростить отладку, поскольку вы можете отловить любое странное поведение компилятора. 136 | 137 | Инструменты отладки также могут использовать эти файлы, чтобы вы могли редактировать базовый TypeScript, а не создаваемый файл JavaScript. 138 | 139 | ## Что такое классы в TypeScript? 140 | 141 | Классы представляют собой общие поведения и атрибуты группы связанных объектов. 142 | 143 | Например, нашим классом может быть `Student`, у каждого из которых есть метод `attendClass`. С другой стороны, `John` является отдельным экземпляром типа `Student` и может иметь дополнительные уникальные поведения, такие как `attendExtracurricular`. 144 | 145 | Вы объявляете классы с помощью ключевого слова `class`: 146 | 147 | ```typescript 148 | class Student { 149 | studCode: number; 150 | studName: string; 151 | constructor(code: number, name: string) { 152 | this.studName = name; 153 | this.studCode = code; 154 | } 155 | } 156 | ``` 157 | -------------------------------------------------------------------------------- /answers/advanced.md: -------------------------------------------------------------------------------- 1 | ## Что такое стрелочные/лямбда функции? 2 | 3 | Функция жирной стрелки - это сокращенный синтаксис для определения функциональных выражений анонимных функций. Это похоже на лямбда-функции в других языках. Функция стрелки позволяет пропустить ключевое слово функции и написать более лаконичный код. 4 | 5 | ## Объясните Rest параметры и правила объявления таких параметров. 6 | 7 | Rest параметры позволяют передавать функции различное количество аргументов (ноль или более). Это полезно, когда вы не знаете, сколько параметров получит функция. Все аргументы после оставшегося символа `...` будут сохранены в массиве. 8 | 9 | Например: 10 | 11 | ```typescript 12 | function Greet(greeting: string, ...names: string[]) { 13 | return greeting + " " + names.join(", ") + "!"; 14 | } 15 | 16 | Greet("Hello", "Steve", "Bill"); // returns "Hello Steve, Bill!" 17 | 18 | Greet("Hello"); // returns "Hello !" 19 | ``` 20 | 21 | ## Что такое Triple-Slash директивы? 22 | 23 | Директивы с тройной косой чертой - это однострочные комментарии, содержащие тег XML для использования в качестве директив компилятора. Каждая директива указывает, что загружать в процессе компиляции. Директивы с тройной косой чертой работают только в верхней части своего файла и будут рассматриваться как обычные комментарии в любом другом месте файла. 24 | 25 | - `/// ` - является наиболее распространенной директивой и определяет зависимость между файлами. 26 | 27 | - `/// ` - похож на path, но определяет зависимость для пакета. 28 | 29 | - `/// ` - позволяет явно включить встроенный файл lib. 30 | 31 | ## Что делает тип Omit? 32 | 33 | Omit - это форма служебного типа, которая упрощает преобразования общих типов. Omit позволяет вам создать тип, передав текущий тип и выбрав ключи, которые нужно пропустить в новом типе. 34 | 35 | ```typescript 36 | Omit; 37 | ``` 38 | 39 | Например: 40 | 41 | ```typescript 42 | interface Todo { 43 | title: string; 44 | description: string; 45 | completed: boolean; 46 | createdAt: number; 47 | } 48 | 49 | type TodoPreview = Omit; 50 | ``` 51 | 52 | ## Что такое перегрузка функции в TypeScript? 53 | 54 | Перегрузка функции - это способ определить функцию с несколькими вариантами типов и реализаций. Перегруженная функция может иметь несколько определений, которые отличаются по количеству и типу параметров. 55 | 56 | ```typescript 57 | function add(a: string, b: string): string; 58 | function add(a: number, b: number): number; 59 | function add(a: any, b: any): any { 60 | return a + b; 61 | } 62 | ``` 63 | 64 | ## Как сделать все свойства интерфейса необязательными? 65 | 66 | Вы можете использовать тип `Partial`, чтобы легко сделать все свойства необязательными. 67 | 68 | ```typescript 69 | Partial; 70 | ``` 71 | 72 | ## Когда нужно использовать ключевое слово unknown? 73 | 74 | Вам следует использовать unknown, если вы не знаете, какой тип ожидать заранее, но хотите назначить его позже, и ключевое слово any не будет работать. 75 | 76 | ## Что такое декораторы и к чему их можно применить? 77 | 78 | Декоратор - это особый вид объявления, который позволяет вам изменять классы или члены классов сразу, помечая их аннотацией `@`. Каждый декоратор должен ссылаться на функцию, которая будет оцениваться во время выполнения. 79 | 80 | Например, декоратор @sealed будет соответствовать запечатанной функции. Все, что помечено `@sealed`, будет использоваться для оценки запечатанной функции. 81 | 82 | ```typescript 83 | function sealed(target) { 84 | // do something with 'target' ... 85 | } 86 | ``` 87 | 88 | Их можно прикрепить к: 89 | 90 | - Объявлениям классов 91 | - Методам 92 | - Свойствам-аксессорам 93 | - Свойствам 94 | - Параметрам 95 | 96 | По умолчанию декораторы не включены. Чтобы включить их, вы должны отредактировать поле `experimentalDecorators` в параметрах компилятора в файле tsconfig.json или в командной строке. 97 | 98 | ## Что такое тип awaited? 99 | 100 | Тип Awaited - это новый утилитарный тип, введенный в TypeScript 4.5. Этот тип предназначен для представления действий, таких как ожидание (await) в асинхронных функциях и метода .then() для обработки промисов - прежде всего, способа рекурсивной распаковки промисов. 101 | 102 | ```typescript 103 | type Awaited = T extends PromiseLike ? Awaited : T; 104 | ``` 105 | 106 | ## В чем разница между типами never и void? 107 | 108 | Тип `void` представляет отсутствие какого-либо типа. Это означает, что функция не возвращает значение или переменная не имеет типа значения. 109 | 110 | ```typescript 111 | function doSomething(): void { 112 | // ... 113 | } 114 | ``` 115 | 116 | Тип `never` представляет недостижимый код. Это означает, что функция никогда не возвращает значение или переменная не может иметь значение. 117 | 118 | ```typescript 119 | function doSomething(): never { 120 | throw "never"; 121 | } 122 | ``` 123 | 124 | ## В чем разница между implements и extends? 125 | 126 | `implements` - это ключевое слово, которое используется для принудительной реализации методов и свойств интерфейса в классе. 127 | 128 | ```typescript 129 | interface IEmployee { 130 | empCode: number; 131 | empName: string; 132 | } 133 | 134 | class Employee implements IEmployee { 135 | empCode: number; 136 | empName: string; 137 | } 138 | ``` 139 | 140 | `extends` - это ключевое слово, которое используется для наследования методов и свойств базового класса в производном классе. 141 | 142 | ```typescript 143 | class Person { 144 | name: string; 145 | } 146 | 147 | class Employee extends Person { 148 | empCode: number; 149 | } 150 | ``` 151 | 152 | ## Что такое условные типы в TypeScript? 153 | 154 | Условные типы - это возможность в TypeScript, которая позволяет создавать типы, которые зависят от условий. Они используются для создания типов, которые могут варьироваться в зависимости от входных параметров. 155 | 156 | ```typescript 157 | type TypeName = T extends string 158 | ? "string" 159 | : T extends number 160 | ? "number" 161 | : T extends boolean 162 | ? "boolean" 163 | : T extends undefined 164 | ? "undefined" 165 | : T extends Function 166 | ? "function" 167 | : "object"; 168 | ``` 169 | -------------------------------------------------------------------------------- /answers/more.md: -------------------------------------------------------------------------------- 1 | ## Назовите модификатор доступа по умолчанию? 2 | 3 | По умолчанию все члены класса в TypeScript являются public (общедоступными). Доступ к ним можно получить где угодно без каких-либо ограничений. 4 | 5 | ## Когда нужно использовать ключевое слово declare? 6 | 7 | Ключевое слово declare используется для внешних объявлений, в которых вы хотите определить переменную, которая, возможно, не была получена из файла TypeScript. 8 | 9 | ## Что такое дженерики в TypeScript? 10 | 11 | Generics - это инструмент, который позволяет создавать компоненты, которые можно переиспользовать. Он создает компонент, который может работать с различными типами данных. Это позволяет пользователям использовать свои собственные типы. Generics гарантируют, что программа масштабируемой в долгосрочной перспективе. 12 | 13 | ```typescript 14 | function identity(arg: T): T { 15 | return arg; 16 | } 17 | let output1 = identity("myString"); 18 | let output2 = identity(100); 19 | ``` 20 | 21 | ## Как и когда нужно использовать enum? 22 | 23 | В TypeScript `enum` представляют собой структуры данных постоянной длины, которые содержат набор констант. `Enum` полезны при присвоении свойств или значений, которые могут быть только определенным количеством возможных значений. Одним из распространенных примеров является значение масти одной карты в колоде игральных карт. Есть только 4 масти и не существует других возможных значений, и эти значения вряд ли изменятся. По этой причине `enum` было бы эффективным и ясным способом описания возможных мастей карты. 24 | 25 | ## Что такое пространство имен и как его использовать? 26 | 27 | Пространство имен используется для логической группировки функций. Пространство имен может включать интерфейсы, классы, функции и переменные для поддержки одной или группы связанных функций. 28 | 29 | Пространство имен может быть создано с помощью ключевого слова `namespace`, за которым следует имя пространства имен. Все интерфейсы, классы и т. Д. Можно определить в фигурных скобках `{}`. 30 | 31 | ## Как реализовать необязательные параметры? 32 | 33 | - Используйте синтаксис параметра `?: type`, чтобы сделать параметр необязательным. 34 | - Используйте выражение `typeof (параметр)! == 'undefined'`, чтобы проверить, был ли параметр инициализирован. 35 | 36 | ```typescript 37 | function multiply(a: number, b: number, c?: number): number { 38 | if (typeof c !== "undefined") { 39 | return a * b * c; 40 | } 41 | return a * b; 42 | } 43 | ``` 44 | 45 | ## TypeScript функциональный язык программирования? 46 | 47 | TypeScript поддерживает некоторые методы функционального программирования - в основном потому, что он имеет те же функции высшего порядка и замыкания, что и JavaScript. 48 | 49 | ## Как с помощью TypeScript сделать переиспользуемые компоненты? 50 | 51 | Generics - это инструмент, который позволяет создавать компоненты, которые можно переиспользовать. Он создает компонент, который может работать с различными типами данных. Это позволяет пользователям использовать свои собственные типы. Generics гарантируют, что программа масштабируемой в долгосрочной перспективе. 52 | 53 | ```typescript 54 | function identity(arg: T): T { 55 | return arg; 56 | } 57 | let output1 = identity("myString"); 58 | let output2 = identity(100); 59 | ``` 60 | 61 | ## В чем разница между tuple и массивом в TypeScript? 62 | 63 | Обычно `tuple` представляет собой фиксированного размера массив, состоящий из элементов известного типа. Порядок элементов должен соблюдаться. 64 | 65 | ```typescript 66 | const primaryColors: [string, string, string] = [ 67 | "#ff0000", 68 | "#00ff00", 69 | "#0000ff", 70 | ]; 71 | console.log(primaryColors); 72 | ``` 73 | 74 | ## В чем разница между внутренними и внешними модулями TypeScript? 75 | 76 | ### Внешний модуль 77 | 78 | Например. В файле main.d.ts: 79 | 80 | ```typescript 81 | import log = module("log"); 82 | log.message("hello"); 83 | ``` 84 | 85 | Этот ссылается на внешний модуль log, который определен в файле log.ts. 86 | 87 | ```typescript 88 | export function message(s: string) { 89 | console.log(s); 90 | } 91 | ``` 92 | 93 | ### Внутренний модуль 94 | 95 | В этом файле есть два внутренних модуля X.Y.Z. 96 | 97 | ```typescript 98 | module A.B.C { 99 | import XYZ = X.Y.Z; 100 | export function ping(x: number) { 101 | if (x > 0) { 102 | XYZ.pong(x – 1) 103 | }; 104 | } 105 | } 106 | module X.Y.Z { 107 | import ABC = A.B.C; 108 | export function pong(x: number) { 109 | if (x > 0) { 110 | ABC.ping(x – 1) 111 | }; 112 | } 113 | } 114 | ``` 115 | 116 | ## Какие коллекции поддерживает TypeScript? 117 | 118 | ### Массивы 119 | 120 | ```typescript 121 | let num: number[] = [1, 2, 3]; 122 | const numToo: Array = [1, 2, 3]; 123 | ``` 124 | 125 | ### Tuples 126 | 127 | ```typescript 128 | const life: [string, number] = ["everything", 42]; 129 | ``` 130 | 131 | ### Объекты 132 | 133 | ```typescript 134 | const planet: { name: string; position: number } = { 135 | name: "earth", 136 | position: 3, 137 | }; 138 | ``` 139 | 140 | ### Map 141 | 142 | ```typescript 143 | const planet = new Map(); 144 | planet.set("name", "earth"); 145 | planet.set("position", "1"); 146 | 147 | console.log(planet); 148 | // Map { 'name' => 'earth', 'position' => '1' } 149 | ``` 150 | 151 | ### Set 152 | 153 | Набор - это упорядоченный список значений без дубликатов. 154 | 155 | ```typescript 156 | const planet = new Set(); 157 | planet.add("earth"); 158 | 159 | console.log(planet); 160 | // Set { 'earth' } 161 | ``` 162 | 163 | ### WeakMap и WeakSet 164 | 165 | WeakMap 166 | 167 | ```typescript 168 | const planet = new WeakMap<{ bodyType: string }, string>(); 169 | planet.set({ bodyType: "planet" }, "earth"); 170 | ``` 171 | 172 | WeakSet 173 | 174 | ```typescript 175 | const planet = new WeakSet<{ name: string }>(); 176 | planet.add({ name: "earth" }); 177 | ``` 178 | 179 | ## Для чего используется тип Record? 180 | 181 | Создает тип объекта, ключи свойств которого `Keys`, а значениями свойств - `Type`. Эту утилиту можно использовать для сопоставления свойств одного типа с другим типом. 182 | 183 | ```typescript 184 | interface CatInfo { 185 | age: number; 186 | breed: string; 187 | } 188 | 189 | type CatName = "miffy" | "boris" | "mordred"; 190 | 191 | const cats: Record = { 192 | miffy: { age: 10, breed: "Persian" }, 193 | boris: { age: 5, breed: "Maine Coon" }, 194 | mordred: { age: 16, breed: "British Shorthair" }, 195 | }; 196 | ``` 197 | 198 | ## В чем преимущества TypeScript? 199 | 200 | Основная особенность TypeScript в том, что он поддерживает статическую типизацию. Это улучшает качество и понимание кода и упрощает обнаружение ошибок. Более того, TypeScript - незаменимый инструмент при работе с командами и несколькими разработчиками. 201 | 202 | ### 1. TypeScript упрощает знакомство с проектом 203 | 204 | Одним из преимуществ TypeScript для крупных проектов является то, что его могут легко поддерживать разные люди и команды. Явно указанные структуры данных и аннотации типов значительно упрощают понимание решений, принимаемых инженерами, написавшими код. Другими словами, с помощью TypeScript можно гораздо быстрее познакомить новых разработчиков с проектами. 205 | 206 | ### 2. TypeScript минимизирует количество ошибок на этапе разработки 207 | 208 | TypeScript предупреждает пользователя об ошибках типа в коде. Поскольку ошибки обнаруживаются редактором, а не пользователем или компилятором, разработчикам не нужно для этого билдить проект, что позволяет им сэкономить много времени. 209 | 210 | ### 3. Open Source поддерживает сильная команда разработчиков 211 | 212 | TypeScript также поддерживается некоторыми из самых влиятельных имен в индустрии программного обеспечения. Slack, Asana и Visual Studio Code - это лишь несколько примеров программного обеспечения, использующего этот язык. 213 | 214 | Кроме того, многие замечательные инструменты JavaScript, такие как фреймворки (Angular, Aurelia или Ionic) и библиотеки, разработаны на TypeScript (ZoomCharts, yWorks или GoJS). Даже такие технологические гиганты, как Microsoft, JetBrains, eBay, Ericsson и Ubisoft, публично заявили, что используют TypeScript. 215 | 216 | Сообщество TypeScript постоянно растет, поэтому пользователи получают постоянную поддержку со стороны сильной команды разработчиков. 217 | 218 | ### 4. Удобство работы с данными 219 | 220 | Использование TypeScript дает множество преимуществ, но все разработчики ценят то, что он значительно упрощает работу с данными. Код TypeScript, в отличие от JavaScript, более надежен и легче поддается рефакторингу. 221 | 222 | ### 5. Удобные инструменты разработки 223 | 224 | TypeScript включает в себя довольно много инструментов, которые повышают производительность и значительно упрощают создание больших кодовых баз. Кроме того, этот язык программирования позволяет разработчикам не использовать модульные тесты в проекте. С TypeScript (TS) все остается так, как было изначально определено. Определения, написанные TS, во многих случаях могут заменить документацию. 225 | 226 | ## TypeScript поддерживает абстрактные классы? 227 | 228 | TypeScript поддерживает абстрактные классы с 2015 года, что приводит к ошибкам компилятора при попытке создать экземпляр этого класса. TypeScript 4.2 добавляет поддержку объявления, что функция конструктора является абстрактной. 229 | --------------------------------------------------------------------------------