You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何声明元组联合类型,使得解构后变量的类型仍保持关联

问题分析

你当前的写法无法达到预期类型推断的核心原因是:当你在函数外部提前将联合元组解构为独立变量a和b后,TypeScript 会将两个变量的类型推导为独立的联合类型a: number | null、b: number | null,不会保留二者之间的类型关联约束,因此收窄a的类型时无法联动推导b的类型。

解决方案

方案1:在函数参数中直接解构元组(最简便)

TypeScript 支持对函数入参的联合元组类型做关联收窄,直接在参数位置解构就能满足你的需求,元组类型本身不需要修改:

type Tuple = [number, null] | [null, number];

// 直接在参数位置解构
const fun = ([a, b]: Tuple) => {
  if (a === null) {
    const c = b; // 自动推断为 number 类型
    return;
  }
  const d = b; // 自动推断为 null 类型
}

方案2:不提前解构,直接通过元组索引判断

如果不想把元组作为参数传入,也可以直接操作元组的索引,TypeScript 可以识别联合元组的索引关联约束:

declare const tuples: [number, null] | [null, number];

const fun = () => {
  if (tuples[0] === null) {
    const c = tuples[1]; // 自动推断为 number 类型
    return;
  }
  const d = tuples[1]; // 自动推断为 null 类型
}

方案3:在条件分支内解构

如果必须要使用解构后的变量名,可以把解构操作放到对应条件分支内,此时分支内的元组类型已经完成收窄,解构后变量的类型也会自动推导正确:

declare const tuples: [number, null] | [null, number];

const fun = () => {
  if (tuples[0] === null) {
    const [a, b] = tuples;
    const c = b; // 自动推断为 number 类型
    return;
  }
  const [a, b] = tuples;
  const d = b; // 自动推断为 null 类型
}

内容的提问来源于stack exchange,提问作者Alexander Pankin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:24:03