【问题标题】:Control flow not type-narrowing with union tuple?控制流不使用联合元组进行类型缩小?
【发布时间】:2021-10-21 15:13:27
【问题描述】:

我对元组有疑问:

export async function redirectIf(
  nextCookies: NextApiRequestCookies,
  options: { notAuth: PagePath },
): Promise<[Redirect, undefined] | [undefined, UserDto]>;

如果redirect 不存在,则不知道user 存在:

Playground

【问题讨论】:

  • 希望您不要介意,我冒昧地编辑了您的问题标题。
  • 一点也不,那就更好了!谢谢你,@msanford!
  • 这是一个有趣的问题,使用了一些不错的 TS 功能,我自己也很好奇。很高兴您找到了答案(并回到这里发布)!如果您好奇,this 是引入控制流类型缩小的地方。
  • 感谢您的参考和 TypeScript 的大脑团队的辛勤工作。

标签: typescript types tuples type-narrowing


【解决方案1】:

感谢TypeScript Community discord 服务器上的 Gerrit0#7591 回答:


TypeScript 不跟踪单独变量的缩小。如果你有:

const x: [true, string] | [false, Error] = ...

并检查元组的第一个元素,然后TS可以缩小类型:

if (x[0]) {
  // TS knows x[1] is a string
}

但如果你先解构,那么你有两个(据 TS 所知)完全不相关的变量。

const [isStr, val] = x
if (isStr) {
   // val is string | Error, not string
}

除了不解构或在充分缩小类型后进行解构之外,没有真正的解决方法。

if (x[0]) {
  const val = x[1] // val: string
}

【讨论】:

  • (别忘了稍后回来并将其标记为已接受的答案。)
  • 当然可以。
猜你喜欢
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 2022-10-02
  • 2021-06-09
  • 2018-01-01
  • 1970-01-01
相关资源
最近更新 更多