Bug报告
我本以为 doesNotNarrow
(下文)也能将 x.b
缩小为 NonUndefined<B>
。
🔎 搜索词
通用,缩小,区分,联合,可选
🕗 版本与回归信息
这是我尝试的每个版本的行为,我也查阅了所有常见问题条目的内容。
⏯ Playground链接
带有相关代码的Playground链接
💻 代码
type NonUndefined<T> = T extends undefined ? never : T
type X<A, B> = { a: NonUndefined<A>, b?: never } | { a?: never, b: NonUndefined<B> }
function doesNarrow(x: X<number, number>) {
if (x.a === undefined) {
const y = x.b
// ^? number
}
}
function doesNotNarrow<A extends number, B extends number>(x: X<A, B>) {
if (x.a === undefined) {
const y = x.b
// ^? NonUndefined<B> | undefined
}
}
🙁 实际行为
x.b
没有被缩小。
🙂 预期行为
我预期 x.b
能够被缩小,因为如果 x.a
是 undefined
的话,那么 x
必须是区分联合的后半部分,因为 x.a
在那里只能是 undefined
。TypeScript 似乎能够在类型参数为常量/非泛型时解决这个问题(参见 doesNarrow
),但出于某种原因,它无法解决泛型情况(尽管 NonUndefined
应该使其成为可能)。
4条答案
按热度按时间wmvff8tz1#
TypeScript没有否定类型,因此通过诸如
NonUndefined
之类的构造尝试重新创建它们注定会失败。rqdpfwrv2#
这个问题已经被标记为"重复",并且最近没有活动。它已经自动关闭,以进行维护。
cczfrluj3#
即使没有
NonUndefined
,并且将泛型限制为number
,它也无法解决这个问题。这两个函数在缩小方面可能应该表现得相同。
e1xvtsh34#
即使没有
NonUndefined
,并且将泛型限制为number
,它也无法解决这个问题。这两个函数在缩小方面可能应该表现得相同。
@RyanCavanaugh 想知道你是否能再次查看这个问题?特别是我在上面的讨论区中的评论?我认为这个问题并不是与上面提供的Playground链接中提出的否定类型功能请求的重复。你怎么看?