能否为数组长度添加类型守卫?为何at()方法未收窄类型?
解决TypeScript中
at()方法无法通过数组长度判断收窄类型的问题 你遇到的问题是TypeScript类型系统的设计特性导致的:Array.at()的类型定义本身就返回元素类型 | undefined,即便你通过arr.length > 0确认数组非空,TypeScript的控制流分析也不会自动将at(0)的返回类型收窄为非undefined。不用类型断言的话,有几种可行的替代方案:
使用数组索引访问:TypeScript会在判断
arr.length > 0后,自动将arr[0]的类型收窄为string:type Arr = string[] const arr: Arr = ["a"] if (arr.length > 0) { const a = arr[0]; // ^? string }使用数组解构:对非空数组进行解构,第一个元素的类型会被正确识别:
type Arr = string[] const arr: Arr = ["a"] if (arr.length > 0) { const [a] = arr; // ^? string }使用
shift()方法(注意会修改原数组):如果允许修改原数组,shift()在数组非空时返回的类型会被收窄为元素类型:type Arr = string[] const arr: Arr = ["a"] if (arr.length > 0) { const a = arr.shift(); // ^? string }
这些方法都不需要使用类型断言就能得到正确的非undefined类型。
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

