Skip to content

Commit f821ecc

Browse files
committed
book(добавление): add part 4.7
add part 4.7
1 parent dac4ace commit f821ecc

File tree

3 files changed

+95
-0
lines changed
  • book/ru/chapters
    • 036.(Работа с типами) Импорт и экспорт только типа
    • 045.(Работа с типами) Условные типы (Conditional Types)
    • 062.(Компилятор) Опции компилятора

3 files changed

+95
-0
lines changed

book/ru/chapters/036.(Работа с типами) Импорт и экспорт только типа/content.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,3 +506,36 @@ let dataFromModuleWithoutSideEffects: IDataFromModuleWithoutSideEffects = {};
506506
Скомпилированный код после устранения ошибок, то есть после уточнения, включать в себя импорты не будет.
507507

508508
В заключение стоит заметить, что, теоретически, уточнение класса, используемого только в качестве типа, способно ускорить компиляцию, поскольку это избавляет компилятор от ненужных проверок на вовлечении его в логику работы модуля. Кроме того, уточнение формы импорта/экспорта — это ещё один способ сделать код более информативным.
509+
510+
511+
## Разрешение импорта и экспорта только типа с помощью resolution-mode
512+
513+
Компилятор _TypeScript_ умеет успешно разрешать сценарии при импортировании таких модулей, как `CommonJS` и `ECMAScript`. Для разрешения импорта только типа существует отдельный механизм, который осуществляется путем указания после пути до модуля ключевого слова `assert` за которым в фигурных скобках определяется конфигурация позволяющая конкретизировать вид модулей.
514+
515+
`````ts
516+
// Для require()
517+
import type { TypeFromRequere } from "module-name" assert {
518+
"resolution-mode": "require"
519+
};
520+
521+
// Для import
522+
import type { TypeFromImport } from "module-name" assert {
523+
"resolution-mode": "import"
524+
};
525+
526+
export interface MergedType extends TypeFromRequere, TypeFromImport {}
527+
`````
528+
529+
Помимо этого, утверждения можно применить и к динамическому импорту..
530+
531+
`````ts
532+
import("module-name", { assert: { "resolution-mode": "require" } }).TypeFromRequire;
533+
import("module-name", { assert: { "resolution-mode": "import" } }).TypeFromImport;
534+
`````
535+
536+
..а также, к коментарной директиве.
537+
538+
`````ts
539+
/// <reference types="module-name" resolution-mode="require" />
540+
/// <reference types="module-name" resolution-mode="import" />
541+
`````

book/ru/chapters/045.(Работа с типами) Условные типы (Conditional Types)/content.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,3 +202,37 @@ type ParamType<T> = T extends { a: infer A, b: infer B } ? A | B : undefined;
202202

203203
let v: ParamType<{ a: number, b:string }>; // let v: string | number
204204
`````
205+
206+
## Ограничение infer с помощью extends
207+
208+
Условные типы позволяют творить настоящие чудеса, но иногда бывают немного громоздки. Для примера представьте сценарий при котором необходимо получить тип первого элемента кортежа, но только тогда, когда этот тип совместим со `string`.
209+
210+
`````ts
211+
type FirstNumberItem<T> =
212+
T extends [infer S, ...unknown[]]
213+
? S extends number ? S : never
214+
: never;
215+
216+
// type A = number
217+
type A = FirstNumberItem<[number, boolean, string]>;
218+
219+
// type B = 100
220+
type B = FirstNumberItem<[100, boolean, string]>;
221+
222+
// type C = 100 | 500
223+
type C = FirstNumberItem<[100 | 500, boolean]>;
224+
225+
// type D = never
226+
type D = FirstNumberItem<[boolean, number, number]>;
227+
`````
228+
229+
Несмотря на то, что данный код решает возложенную на него задачу, вложенные условные выражения затрудняют его читаемость. исправить эту ситуацию призван механизма позволяющий ограничивать переменные типа `infer` конкретным типом при помощи ключевого слова `extends`.
230+
231+
`````ts
232+
type FirstNumberItem<T> =
233+
T extends [infer S extends number, ...unknown[]] ? S : never;
234+
235+
/**
236+
* ..здесь располагается код аналогичный предыдущему.
237+
*/
238+
`````

book/ru/chapters/062.(Компилятор) Опции компилятора/content.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2736,3 +2736,31 @@ let o: T = {
27362736
**type**: `boolean`
27372737
**default**: `false`
27382738
**values**: `true`, `false`
2739+
2740+
2741+
## moduleSuffixes
2742+
2743+
2744+
`--moduleSuffixes` - указывает правила для разрешения модулей на основе расширений.
2745+
2746+
2747+
`````json
2748+
{
2749+
"compilerOptions": {
2750+
"moduleSuffixes": [".ios", ".native", ""]
2751+
}
2752+
}
2753+
`````
2754+
2755+
При конфигурации выше, код ниже..
2756+
`````ts
2757+
import * as x from "./x";
2758+
`````
2759+
2760+
..будет разрешен таким образом, что сначала осуществится поиск `./x.ios`, затем `./x.native` и наконец `./x.ts`.
2761+
Стоит обратить внимает, что указание пустой строки в качестве элемента параметра `moduleSuffixes` требуется для указания поиска файлов с расширением `.ts` и это значение является значение по умолчанию.
2762+
2763+
2764+
**type**: `string`
2765+
**default**: `[""]`
2766+
**values**: `.*`

0 commit comments

Comments
 (0)