繁体   English   中英

Typescript 在元组联合内缩小

[英]Typescript narrowing down within union of tuples

假设我有一个像这样的 function:

function foo(n: number): [number, undefined] | [undefined, number] {
  if (n % 2 === 0) {
    return [n, undefined];
  }
  return [undefined, n];
}

然后像这样调用这个 function :

function bar() {
  const [a, b] = foo(2);
  if (a === undefined) {
    return b; // TypeScript infers b as number | undefined
  }
  return a; // TypeScript infers a as number (good!)
}

因为 function foo 返回元组(number, undefined)(undefined, number) ,在没有通过a === undefined检查后,TypeScript 能够在返回时推断a的类型是数字。

if块中,因为a是未定义的,我们(人类)可以将 foo 的返回类型推断为[undefined, number]因此, b的类型为 number。 然而 TypeScript 似乎不够聪明,无法分辨这一点,并报告说它是number | undefined number | undefined

是否有缩小元组联合范围的解决方法?

TypeScript 的区分联合不会跟踪ab之间的依赖关系,因此在您解构数组后,缩小a不会影响b的类型。 要仍然实现所需的缩小,您可以直接测试数组元素,如下所示:

function bar() {
  const arr = foo(2);
  if (arr[0] === undefined) {
    const b = arr[1]
    return b; // TypeScript infers b as number (good!)
  }
  const a = arr[0]
  return a; // TypeScript infers a as number (good!)
}

TypeScript操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM