Skip to content

Commit 480f6e9

Browse files
committed
win(исправление): fix bug with TS
fix bug with TS
1 parent 657566c commit 480f6e9

File tree

2 files changed

+91
-0
lines changed
  • what-is-new/4.8
    • [КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ] Неограниченные генерики больше не совместимы с {}
    • [КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ] Типы больше не могут быть импортированы и экспортированы в JavaScript файлах

2 files changed

+91
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
## [КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ] Неограниченные генерики больше не совместимы с {}
2+
3+
До этого неограниченные параметры типа были совместимы с типом `{}`.
4+
5+
`````ts
6+
function f<T> ( p: T ) {
7+
let a: {} = p; // (раньше) Ok
8+
}
9+
`````
10+
11+
Это поведение было причиной возникновения различного рода казусов.
12+
13+
`````ts
14+
function toKeys ( object: {} ) {
15+
Object.keys( object );
16+
}
17+
18+
function f<T> ( p: T ) {
19+
let keys = toKeys( p ) // (раньше) Ok, но ошибка вовремя выполнения программы поскольку в функцию toKeys может
20+
// попасть undefined
21+
}
22+
23+
f( undefined ); // ломаем программу передав undefined
24+
`````
25+
26+
В связи с этим поведение было изменено.
27+
28+
`````ts
29+
function f<T> ( p: T ) {
30+
let a: {} = p; // (раньше) Ok (теперь) Error -> Type 'T' is not assignable to type '{}'.(2322)
31+
}
32+
`````
33+
34+
Для сохранения логики при новом поведении необходимо явно ограничить параметр типа..
35+
36+
`````ts
37+
function f<T extends {}> ( p: T ) {
38+
let a: {} = p; // (раньше) Ok (теперь) Ok
39+
}
40+
`````
41+
42+
..не допустить принадлежность к `null` или `undefined` при помощи условия..
43+
44+
`````ts
45+
function f<T> ( p: T ) {
46+
if( p === null || p === undefined ){
47+
return;
48+
}
49+
50+
let a: {} = p; // (раньше) Ok (теперь) Ok
51+
}
52+
`````
53+
..или в случае уверенности в наличии значения прибегнуть к помощи ненулевого утверждения (`x!`).
54+
55+
`````ts
56+
function toKeys ( object: {} ) {
57+
Object.keys( object );
58+
}
59+
60+
function f<T> ( p: T ) {
61+
let keys = toKeys( p! ) // (раньше) Ok (теперь) Ok
62+
}
63+
`````
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
## [КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ] Типы больше не могут быть импортированы и экспортированы в JavaScript файлах
2+
3+
До этого момента компилятор _TypeScript_ справлялся с компиляцией файлов _JavaScript_ в которых выполнялся импори или экспорт типов не имеющих реального значения. Поскольку в настоящем _JavaScript_ подобное вызывает ошибку, данное поведение было исправлено.
4+
5+
6+
7+
`````ts
8+
- import { SomeValue, SomeType } from "some-module";
9+
+ import { SomeValue } from "some-module";
10+
11+
/**
12+
- * @type {SomeType}
13+
+ * @type {import("some-module").SomeType}
14+
*/
15+
export const value = SomeValue;
16+
`````
17+
18+
`````ts
19+
/**
20+
* @typedef {string | number} SomeType
21+
*/
22+
23+
+ /**
24+
+ * @typedef {SomeType} SomeTypeExported
25+
+ */
26+
- export { SomeType as SomeTypeExported };
27+
`````
28+

0 commit comments

Comments
 (0)