如何声明元组联合类型,使得解构后变量的类型仍保持关联
问题分析
你当前的写法无法达到预期类型推断的核心原因是:当你在函数外部提前将联合元组解构为独立变量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
相关产品推荐
相关产品推荐

