TypeScript 变量(从一个区分联合对象中提取)在被导出后失去了缩小的类型,

v440hwme  于 9个月前  发布在  TypeScript
关注(0)|答案(2)|浏览(114)

🔎 搜索词

discriminate union export destructure destructuring

🕗 版本和回归信息

  • 我在尝试的每个版本中都遇到了这种行为(包括夜间版本),我查阅了关于(export,destructure,discriminate,union)的FAQ条目。

⏯ Playground链接

https://www.typescriptlang.org/play/?#code/GYVwdgxgLglg9mABAQwhApgBygZSgJxjAHMB5MAGwE8AKAfQA8AuRAZwKOIEpEBvRAL4AoUJFgIUaLFAByIChQCCYACYBVVemBF0K8tXrNEYeRUQAfROBVadKnv2Ejw0eEgC2IKCGQKqAUTBkACMKXQAFZBh8AB4AFQA+GgA3XxB0FjiuFl4hRER0INDdFgJ0gBo8xFSKdJYZBDkFELD4hMqBCz4qwpaSxGBfVnRK-Jq641Mu61swXQ7u-JhgRBoTBUQAXm3qtPQLSxntOZUtnfH0Byr8-HRvfCR+XuKVFkGKYfLd2ozJjYEANxVTroD77XL5G53EAPPgFIphV6IMojb7pQRA-LCJwQBDsOHPREsfxfC4sABqgi2iE83l81ECfRUkWiNAARKw4O59uxCCQ0eg2VwgUJlqt-Fd8uSAYgAPSyxAAC3Qt0QMCgatYbA4JC+cAA1lVUBhsHg+WRKLRycKhCCwYtENK5Qrlar1Zq-mZDppjvNEAajVJsE0lKoNDZfXpLTRrUCnOgGJg4PgNbiwPingi-RcqZsaV4fH5GS8Wfh2ZzudrzQKhUJRSsaITdJKBTL5UqVft3TAtbzOF11l6rD67F8AO7oaIqQMm3A6i0GC7C52IfwAJTXpDXtoK9ohrZXrq7GqGcA9ff5lkH0xHJxn0hDynUt90+loS7bCvXm+3wiAA

💻 代码

  1. function acceptStringOnly(_x: string) { }
  2. function acceptNullAndUndefinedOnly(_x: null | undefined) { }
  3. function mutuallyEnabledPair<T>(value: T): {
  4. enabled: true,
  5. value: NonNullable<T>,
  6. } | {
  7. enabled: false,
  8. value: null | undefined,
  9. } {
  10. if (null === value || undefined === value) {
  11. return { enabled: false, value: null };
  12. } else {
  13. return { enabled: true, value };
  14. }
  15. }
  16. const { enabled: E, value: V } = mutuallyEnabledPair("some string value");
  17. if (E) {
  18. V; // here it is string, ok
  19. acceptStringOnly(V);
  20. } else {
  21. V; // here it is null | undefined, ok
  22. acceptNullAndUndefinedOnly(V);
  23. }
  24. export const { enabled, value } = mutuallyEnabledPair("some string value")
  25. if (enabled) {
  26. value; // here it is string | null | undefined, weird
  27. acceptStringOnly(value); // ERROR
  28. } else {
  29. value; // here it also is string | null | undefined
  30. acceptNullAndUndefinedOnly(value); // ERROR
  31. }

🙁 实际行为

当从一个discriminated union类型的对象中解构导出变量时,这些变量会失去由discriminated union类型定义的缩小类型。同时,如果变量没有被导出,它们的缩小类型将被保留,这是预期的行为,无论变量是否被导出。

🙂 预期行为

保留以下变量的缩小类型:

  • 从一个discriminated union类型的对象中解构导出
bqucvtff

bqucvtff1#

简化重现:

  1. declare function mutuallyEnabledPair(): {
  2. discriminator: true,
  3. value: string,
  4. } | {
  5. discriminator: false,
  6. value: null | undefined,
  7. }
  8. export const { discriminator, value } = mutuallyEnabledPair()
  9. if (discriminator) {
  10. value;
  11. }
wtlkbnrh

wtlkbnrh2#

在函数getCandidateDiscriminantPropertyAccess中,symbol.valueDeclarationundefinedexport版本中的值,而在没有export的情况下,undefined不是symbol.valueDeclaration。这导致使用判别式缩小的方法不起作用。
#59673似乎解决了这个问题,尽管我怀疑这不是一个合适的解决方案。

相关问题