TypeScript 包含可选属性和泛型类型的歧视性联合体没有缩小,

polhcujo  于 6个月前  发布在  TypeScript
关注(0)|答案(4)|浏览(85)

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.aundefined 的话,那么 x 必须是区分联合的后半部分,因为 x.a 在那里只能是 undefined 。TypeScript 似乎能够在类型参数为常量/非泛型时解决这个问题(参见 doesNarrow ),但出于某种原因,它无法解决泛型情况(尽管 NonUndefined 应该使其成为可能)。

wmvff8tz

wmvff8tz1#

TypeScript没有否定类型,因此通过诸如NonUndefined之类的构造尝试重新创建它们注定会失败。

rqdpfwrv

rqdpfwrv2#

这个问题已经被标记为"重复",并且最近没有活动。它已经自动关闭,以进行维护。

cczfrluj

cczfrluj3#

即使没有 NonUndefined,并且将泛型限制为 number,它也无法解决这个问题。
这两个函数在缩小方面可能应该表现得相同。

e1xvtsh3

e1xvtsh34#

即使没有 NonUndefined,并且将泛型限制为 number,它也无法解决这个问题。
这两个函数在缩小方面可能应该表现得相同。
@RyanCavanaugh 想知道你是否能再次查看这个问题?特别是我在上面的讨论区中的评论?我认为这个问题并不是与上面提供的Playground链接中提出的否定类型功能请求的重复。你怎么看?

相关问题