Skip to content

Commit 3c59006

Browse files
committed
win(исправление): fix 4
fix 4
1 parent 776a9cf commit 3c59006

File tree

3 files changed

+79
-0
lines changed
  • what-is-new/4.8
    • Возникновение ошибки при проверке на равенство с литералом объектного типа
    • Ужесточение правил вывода типов
    • Улучшение производительности для флагов --build, --watch и --incremental

3 files changed

+79
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
## Возникновение ошибки при проверке на равенство с литералом объектного типа
2+
3+
В некоторых языках (как например `Phyton`) оператор `==` в операциях с объектными типами выполняет проверку над _значениями_ объектов, как если бы эти объекты были примитивами.
4+
5+
`````py
6+
// выражение проверяет person_array на отсутствие в нем элементов
7+
if person_array == []:
8+
print("Длина массива равна 0!")
9+
`````
10+
11+
В _JavaScript_ объектные типы представлены ссылками на них, поэтому схожее выражение всегда будет ложным. Поэтому, чтобы облегчить новичкам переход из одного языка в _TypeScript_, его поведение было откорректировано.
12+
13+
`````ts
14+
let array: number[] = [];
15+
// бессмысленное условие (раньше) Ok (теперь) Error -> This condition will always return 'false' since JavaScript compares objects by reference, not value.(2839)
16+
if (array === []) {
17+
18+
}
19+
20+
21+
let object: object = {};
22+
// бессмысленное условие (раньше) Ok (теперь) Error -> This condition will always return 'false' since JavaScript compares objects by reference, not value.(2839)
23+
if (object === {}) {
24+
25+
}
26+
`````
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
## Ужесточение правил вывода типов
2+
3+
В некоторых случаях выводу типов приходится выбирать наиболее уместный _шаблон_ своих действий.
4+
5+
`````ts
6+
declare function mergeRandom<T> ( x: T, y: T ): T;
7+
8+
/**
9+
* function mergeRandom<[number, boolean, string]>(x: [number, boolean, string], y: [number, boolean, string]):
10+
* [number, boolean, string]
11+
*
12+
* a: number, b: boolean, c: string
13+
*/
14+
let [a, b, c] = mergeRandom([100, true, `🙂`], [500, false, `🤩`]);
15+
16+
let a0 = [100, true, `🙂`]; // let a0: (string | number | boolean)[]
17+
let a1 = [500, false, `🤩`]; // let a1: (string | number | boolean)[]
18+
19+
/**
20+
* function mergeRandom<(string | number | boolean)[]>(x: (string | number | boolean)[], y: (string | number |
21+
* boolean)[]): (string | number | boolean)[]
22+
*
23+
* d: string | number | boolean, e: string | number | boolean, f: string | number | boolean
24+
*/
25+
let [d, e, f] = mergeRandom( a0, a1 );
26+
`````
27+
28+
Пример выше иллюстрирует, как выводу типов, помимо выбора между принадлежностью к кортежу или массиву, в стлучае с кортежем приходится прибегать к анализу его элементов. В случае неопределенности, как в примере ниже, вывод типов рассматривал элементы, как принадлежащие к типу `any`, что понижало типобезопасность программ.
29+
30+
`````TS
31+
declare function f<T> ( p?: T ): T;
32+
33+
/**
34+
* (раньше) Ok
35+
* [a: any, b: any, c: any] = function f<[any, any, any]>(p?: [any, any, any] | undefined): [any, any, any]
36+
*
37+
* (теперь) Error -> Type 'unknown' must have a '[Symbol.iterator]()' method that returns an iterator.(2488)
38+
*
39+
* function f<unknown>(p?: unknown): unknown
40+
*/
41+
let [a, b, c] = f();
42+
`````
43+
44+
Начиная с текущей версии, вывод типов больше не прибегает к алгоритмам выбора наиболее подходящего паттерна, а вместо этого выбрасывает при подобных сценариях ошибку, принуждающую к более типобезопасному явному указанию типов.
45+
46+
`````ts
47+
declare function f<T> ( p?: T ): T;
48+
49+
let [a, b, c] = f<[number, boolean, string]>(); // a: number, b: boolean, c: string
50+
`````
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## Улучшение производительности для флагов --build, --watch и --incremental
2+
3+
Оптимизация процессов связанных со сборкой у разработчиков _TypeScript_ всегда находится в особом статусе. Поэтому Начиная с текущей версии сборка будет происходить на `10-25%` быстрее.

0 commit comments

Comments
 (0)