TypeScript类型报错:'number | number[]'无法赋值给'number[]'求解
TypeScript联合类型报错分析与解决
错误原因
TypeScript是静态类型检查语言,它只会依据你定义的类型信息做判断。你的函数返回对象的result属性是number | number[]联合类型,即便你在当前上下文里确定它是number[],编译器没办法识别这个业务逻辑,所以会严格按照联合类型的规则校验,不允许你直接把number | number[]当作number[]来使用,触发类型不兼容的错误。
解决方法
1. 类型断言(快速但需自行保证类型正确性)
直接告诉编译器当前result的类型是number[],语法上用as关键字:
// 假设obj是你获取到的返回对象 const lastItem = (obj.result as number[]).pop();
注意:这种方式跳过了编译器的类型检查,如果你判断错误(实际result是number),运行时会抛出错误,所以只有在你100%确定类型时才用。
2. 内置类型守卫(类型安全推荐)
用Array.isArray()做类型检查,编译器会自动在代码块内把result的类型收窄为number[]:
if (Array.isArray(obj.result)) { const lastItem = obj.result.pop(); // 这里可以安全操作数组 }
3. 自定义类型守卫(复杂场景适用)
如果判断逻辑比较复杂,可以写一个自定义的类型谓词函数,让编译器识别类型:
function isNumberArray(value: number | number[]): value is number[] { return Array.isArray(value); } // 使用时 if (isNumberArray(obj.result)) { const lastItem = obj.result.pop(); }
内容的提问来源于stack exchange,提问作者BitQueen
相关产品推荐
相关产品推荐

