控制流不使用联合元组进行类型缩小?

Posted

技术标签:

【中文标题】控制流不使用联合元组进行类型缩小?【英文标题】: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 的大脑团队的辛勤工作。 【参考方案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


【讨论】:

(别忘了稍后回来并将其标记为已接受的答案。) 当然可以。

以上是关于控制流不使用联合元组进行类型缩小?的主要内容,如果未能解决你的问题,请参考以下文章

unkown类型

javascript高手请进!关于就js控制网页图片放大缩小的问题

设置套接字流不起作用

传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 1 (""): 数据类型 0x38 未知

fetchAssetsWithLocalIdentifiers:options: 我的照片流不工作

如何使用泛型缩小 TypeScript 联合类型