如何让TypeScript自动将类型收窄为tuple[],无需显式断言?
解决TypeScript类型收窄问题:将
tuple | tuple[]统一推断为tuple[] 你的代码逻辑运行正常,但TypeScript无法通过arg[0]的检查联动推断arg的整体类型,导致arr的类型未被正确收窄。可以通过自定义类型谓词解决这个问题,无需显式类型断言。
方法:用类型谓词明确类型判断
先定义一个类型谓词函数,专门判断输入是否为tuple类型:
type tuple = [key: string, value: number]; // 类型谓词:告诉TS返回true时,arg是tuple类型 function isTuple(arg: tuple | tuple[]): arg is tuple { // 判断逻辑:tuple的第一个元素是string类型 return typeof arg[0] === 'string'; }
然后修改原函数,用这个谓词函数做分支判断:
function foo(arg: tuple | tuple[]) { const arr = isTuple(arg) ? [arg] : arg; // 此时TS会正确推断arr的类型为tuple[] console.log(arr.length); } foo(['key', 111]); foo([['key', 222]]);
原理说明
类型谓词arg is tuple相当于给TypeScript明确的类型提示:当isTuple(arg)返回true时,arg的类型就是tuple;反之则是tuple[]。这样条件分支的类型会被精准收窄,arr的类型自然被推断为tuple[]。
如果不想额外定义函数,也可以把判断逻辑直接写在条件里(可读性稍弱):
function foo(arg: tuple | tuple[]) { const arr = (typeof arg[0] === 'string') ? [arg] : arg; // 同样能正确推断arr为tuple[] }
内容的提问来源于stack exchange,提问作者Nimai
相关产品推荐
相关产品推荐

