File tree Expand file tree Collapse file tree 2 files changed +91
-0
lines changed
[КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ] Неограниченные генерики больше не совместимы с {}
[КРИТИЧЕСКОЕ ИЗМЕНЕНИЕ] Типы больше не могут быть импортированы и экспортированы в JavaScript файлах Expand file tree Collapse file tree 2 files changed +91
-0
lines changed Original file line number Diff line number Diff line change 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 number Diff line number Diff line change 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+
You can’t perform that action at this time.
0 commit comments