TypeScript 从联合类型解构出的变量的相互依赖性在控制流语句中丢失,除非在控制流语句中使用,

s3fp2yjn  于 8个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(96)

🔎 搜索词

联合类型元组解构
请扩展此列表或使用更适合的描述编辑标题。

🕗 版本与回归信息

  • 我在每个版本中都尝试了这种行为,并查阅了关于n/a的常见问题解答条目

⏯ Playground链接

https://www.typescriptlang.org/play?ts=5.1.6#code/CYUwxgNghgTiAEYD2A7AzgF3gNyhAjAFzxxTCoQCe8A2gORR0A08DdAuvAD4khkXV6AI2asR7ANwAoAPQz4CxUoUA9APxSpydFhrZ8LbACZOAXhx580rakwWIR+Ob0GcJ+FDSJbGaXKXqsvIAkl4oSPAQqADmIDC8-ChUtABEUCksaSmcPKTkSYIpQhnwRdlSQA

💻 代码

  1. declare const val1: readonly ['a', 'a'] | readonly ['b', 'b'];
  2. // ^?
  3. const [v1, v2] = val1;
  4. const val2 = [v1, v2] as const;
  5. // ^?
  6. // Is no longer readonly ["a", "a"] | readonly ["b", "b"]

🙁 实际行为

当将变量 readonly ["a", "a"] | readonly ["b", "b"] 解构为 [v1, v2] = val 时,编译器足够智能,可以在 if 或甚至 switch 语句中保留两者之间的依赖关系:

  1. if(v1 === 'a') {
  2. v2;
  3. // ^?
  4. // TS is smart enough to know that this is "a"
  5. }

然而,当放回一起时,这种依赖关系就会丢失。对于:

  1. declare const val1: readonly ['a', 'a'] | readonly ['b', 'b'];
  2. const [v1, v2] = val1;
  3. const val2 = [v1, v2] as const;

val1val2 应该完全相同,但是 val2readonly ["a" | "b", "a" | "b"] 。请注意,这不仅适用于元组,还适用于重新和解构的对象。
查看这个合法用例的实际示例以及这如何影响代码。

🙂 预期行为

就像

  1. if(v1 === 'a') {
  2. v2;
  3. // ^?
  4. // TS is smart enough to know that this is "a"
  5. }

一样,编译器应该能够发现当将它们与例如 [v1, v2] 结合时,v1v2 相互依赖,并创建一个相应的元组联合类型而不是包含联合类型成员的单个元组。

6tr1vspr

6tr1vspr1#

See #55257 and ultimately, #30581 . The correlation between the types isn't currently tracked beyond what's needed to support discriminated union narrowing.

z6psavjg

z6psavjg2#

没错,谢谢你提供的链接!我不知道这些。
然而,这个补丁可以被扩展到覆盖类似这些情况,而不会立即解决根本问题。

相关问题