控制流不使用联合元组进行类型缩小?
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
【讨论】:
(别忘了稍后回来并将其标记为已接受的答案。) 当然可以。以上是关于控制流不使用联合元组进行类型缩小?的主要内容,如果未能解决你的问题,请参考以下文章
javascript高手请进!关于就js控制网页图片放大缩小的问题
传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 1 (""): 数据类型 0x38 未知