如何在TypeScript中判断数组类型?解决联合元组类型收窄失败问题
解决TypeScript元组联合类型的类型收窄问题
你遇到的问题是TypeScript无法自动关联元组联合类型中元素的依赖关系——仅检查args[0]的类型,TS没法推断出args[1]对应的结构。下面是几种可行的解决办法:
方法1:自定义类型谓函数(最安全)
写一个类型判断函数,明确告诉TS当前args属于哪个元组分支:
function isStringTuple(args: [string, {a: true}] | [number, {b: true}]): args is [string, {a: true}] { return typeof args[0] === 'string'; } const func = (...args: [string, {a: true}] | [number, {b: true}]) => { if (isStringTuple(args)) { return args[1].a; // TS现在能确定这里的args是[string, {a: true}] } else { return args[1].b; // 自动收窄为[number, {b: true}] } };
方法2:重构为判别式联合类型(更易维护)
如果可以调整参数结构,把元组改成带判别字段的对象联合类型,TS会自动完成类型收窄:
// 定义带判别式的联合类型 type FuncArgs = | { kind: 'string', data: string, props: {a: true} } | { kind: 'number', data: number, props: {b: true} }; const func = (args: FuncArgs) => { if (args.kind === 'string') { return args.props.a; } else { return args.props.b; } };
方法3:手动类型断言(简单但需谨慎)
如果必须保留原元组结构,可以用类型断言强制收窄,不过这种方式需要自己保证逻辑正确:
const func = (...args: [string, {a: true}] | [number, {b: true}]) => { if (typeof args[0] === 'string') { return (args as [string, {a: true}])[1].a; } else { return (args as [number, {b: true}])[1].b; } };
内容的提问来源于stack exchange,提问作者quolpr
相关产品推荐
相关产品推荐

