├── .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 |
--------------------------------------------------------------------------------