🔎 搜索词
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
💻 代码
function acceptStringOnly(_x: string) { }
function acceptNullAndUndefinedOnly(_x: null | undefined) { }
function mutuallyEnabledPair<T>(value: T): {
enabled: true,
value: NonNullable<T>,
} | {
enabled: false,
value: null | undefined,
} {
if (null === value || undefined === value) {
return { enabled: false, value: null };
} else {
return { enabled: true, value };
}
}
const { enabled: E, value: V } = mutuallyEnabledPair("some string value");
if (E) {
V; // here it is string, ok
acceptStringOnly(V);
} else {
V; // here it is null | undefined, ok
acceptNullAndUndefinedOnly(V);
}
export const { enabled, value } = mutuallyEnabledPair("some string value")
if (enabled) {
value; // here it is string | null | undefined, weird
acceptStringOnly(value); // ERROR
} else {
value; // here it also is string | null | undefined
acceptNullAndUndefinedOnly(value); // ERROR
}
🙁 实际行为
当从一个discriminated union类型的对象中解构导出变量时,这些变量会失去由discriminated union类型定义的缩小类型。同时,如果变量没有被导出,它们的缩小类型将被保留,这是预期的行为,无论变量是否被导出。
🙂 预期行为
保留以下变量的缩小类型:
- 从一个discriminated union类型的对象中解构导出。
2条答案
按热度按时间bqucvtff1#
简化重现:
wtlkbnrh2#
在函数
getCandidateDiscriminantPropertyAccess
中,symbol.valueDeclaration
是undefined
在export
版本中的值,而在没有export
的情况下,undefined
不是symbol.valueDeclaration
。这导致使用判别式缩小的方法不起作用。#59673似乎解决了这个问题,尽管我怀疑这不是一个合适的解决方案。