Skip to content

Commit 3f69609

Browse files
committed
win(исправление): fix 2
fix 2
1 parent bbd3dcb commit 3f69609

File tree

1 file changed

+23
-0
lines changed
  • what-is-new/4.8/Улучшение вывода для infer в литеральных строковых типах

1 file changed

+23
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
## Улучшение вывода для infer в литеральных строковых типах
2+
3+
Начиная с текущей версии _TypeScript_ анализирует тип переменных типа `infer` определенных в литеральных строковых типах.
4+
5+
`````ts
6+
function f0 ( p: "true" extends `${ infer U extends boolean }` ? U : never ) {
7+
p; // (раньше) boolean (теперь) true
8+
}
9+
function f1 ( p: "100" extends `${ infer U extends number }` ? U : never ) {
10+
p; // (раньше) number (теперь) 100
11+
}
12+
function f2 ( p: "100" extends `${ infer U extends bigint }` ? U : never ) {
13+
p; // (раньше) bigint (теперь) 100n
14+
}
15+
`````
16+
17+
Но есть один нюанс на который стоит обратить внимание. Дело в том, что новый механизм судит о принадлежности типа на основе двухстороннего анализа. То есть, он сначала преобразует значение к указанному типу, а затем преобразует его обратно к первостепенному типу. И если значение полученное в результате преобразования будет отличаться, то тип будет выведен не литеральный. То есть, логическое выражение `String(Boolean("true"")) === "true"` будет верным, а вот `String(Number("1.0")) === "1.0"` нет, поскольку результатом преобразования `String(Number("1.0"))` будет `1`, а не `1.0`.
18+
19+
`````ts
20+
function f ( p: "1.0" extends `${ infer T extends number }` ? T : never ) {
21+
p; // (раньше) number (теперь) number
22+
}
23+
`````

0 commit comments

Comments
 (0)