Skip to content

Commit

Permalink
通过比较非规范化的交叉类型进行优化
Browse files Browse the repository at this point in the history
  • Loading branch information
zhongsp committed Dec 8, 2023
1 parent 2db476d commit cacada7
Showing 1 changed file with 17 additions and 0 deletions.
17 changes: 17 additions & 0 deletions zh/release-notes/typescript-5.3.md
Original file line number Diff line number Diff line change
Expand Up @@ -351,3 +351,20 @@ export let p: Person;
这使得这些工具能够获得与 TypeScript 编译器相同的内存和速度改进。
注释解析策略的新选项在 `JSDocParsingMode` 中进行了描述。
关于此拉取请求的更多信息,请参阅[PR](https://github.com/microsoft/TypeScript/pull/55739)

## 通过比较非规范化的交叉类型进行优化

在 TypeScript 中,联合类型和交叉类型始终遵循特定的形式,其中交叉类型不能包含联合类型。
这意味着当我们在一个联合类型上创建一个交叉类型,例如 `A & (B | C)`,该交叉类型将被规范化为 `(A & B) | (A & C)`
然而,在某些情况下,类型系统会保留原始形式以供显示目的使用。

事实证明,原始形式可以用于一些巧妙的快速路径类型比较。

例如,假设我们有 `SomeType & (Type1 | Type2 | ... | Type99999NINE)`,我们想要确定它是否可以赋值给 `SomeType`
回想一下,我们实际上没有一个交叉类型作为源类型,而是一个联合类型,看起来像是 `(SomeType & Type1) | (SomeType & Type2) | ... | (SomeType & Type99999NINE)`
当检查一个联合类型是否可以赋值给目标类型时,我们必须检查联合类型的每个成员是否可以赋值给目标类型,这可能非常慢。

在 TypeScript 5.3 中,我们查看了我们能够隐藏的原始交叉类型形式。
当我们比较这些类型时,我们会快速检查目标类型是否存在于源交叉类型的任何组成部分中。

更多详情请参考[PR](https://github.com/microsoft/TypeScript/pull/55851)

0 comments on commit cacada7

Please sign in to comment.