Skip to content

Commit cacada7

Browse files
committed
通过比较非规范化的交叉类型进行优化
1 parent 2db476d commit cacada7

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

zh/release-notes/typescript-5.3.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,3 +351,20 @@ export let p: Person;
351351
这使得这些工具能够获得与 TypeScript 编译器相同的内存和速度改进。
352352
注释解析策略的新选项在 `JSDocParsingMode` 中进行了描述。
353353
关于此拉取请求的更多信息,请参阅[PR](https://github.com/microsoft/TypeScript/pull/55739)
354+
355+
## 通过比较非规范化的交叉类型进行优化
356+
357+
在 TypeScript 中,联合类型和交叉类型始终遵循特定的形式,其中交叉类型不能包含联合类型。
358+
这意味着当我们在一个联合类型上创建一个交叉类型,例如 `A & (B | C)`,该交叉类型将被规范化为 `(A & B) | (A & C)`
359+
然而,在某些情况下,类型系统会保留原始形式以供显示目的使用。
360+
361+
事实证明,原始形式可以用于一些巧妙的快速路径类型比较。
362+
363+
例如,假设我们有 `SomeType & (Type1 | Type2 | ... | Type99999NINE)`,我们想要确定它是否可以赋值给 `SomeType`
364+
回想一下,我们实际上没有一个交叉类型作为源类型,而是一个联合类型,看起来像是 `(SomeType & Type1) | (SomeType & Type2) | ... | (SomeType & Type99999NINE)`
365+
当检查一个联合类型是否可以赋值给目标类型时,我们必须检查联合类型的每个成员是否可以赋值给目标类型,这可能非常慢。
366+
367+
在 TypeScript 5.3 中,我们查看了我们能够隐藏的原始交叉类型形式。
368+
当我们比较这些类型时,我们会快速检查目标类型是否存在于源交叉类型的任何组成部分中。
369+
370+
更多详情请参考[PR](https://github.com/microsoft/TypeScript/pull/55851)

0 commit comments

Comments
 (0)