TypeScript中使用Spread operator构造联合类型数组报错求助
正确实现IMyType[]转换为(IMyType & ISelectable)[]的方法
你的三种写法都存在问题,导致TypeScript无法正确推断目标类型:
- 第一种写法把整个
dataArray作为数组的一个元素,再拼接单个ISelectable对象,得到的是(IMyType[] | {isSelected: boolean})[],完全不符合需求。 - 第二种写法将
dataArray的元素与单个ISelectable对象拼接,数组元素类型是IMyType | {isSelected: boolean},并非交叉类型。 - 第三种写法存在语法错误:箭头函数中直接写
{isSelected: false, ...x}会被解析为代码块,而非对象字面量,需要用括号包裹对象。
正确语法
方法1:修复map的箭头函数写法(推荐)
const extendedArray = dataArray.map(x => ({ isSelected: false, ...x }));
给对象字面量加上括号()后,TypeScript会自动推断每个返回元素为IMyType & ISelectable,数组类型自然匹配(IMyType & ISelectable)[]。
方法2:显式指定map的返回类型(适合复杂场景)
如果TypeScript无法自动推断,可显式指定map的泛型参数:
const extendedArray = dataArray.map<IMyType & ISelectable>(x => ({ isSelected: false, ...x }));
方法3:类型断言(不推荐,仅必要时使用)
若上述方法仍不生效,可通过类型断言强制指定数组类型:
const extendedArray = dataArray.map(x => ({ isSelected: false, ...x })) as (IMyType & ISelectable)[];
补充:原接口定义的语法修正
你写的IMyType接口存在语法错误,TypeScript中接口定义无需冒号,正确写法为:
export interface IMyType { field1: number; field2: number; }
内容的提问来源于stack exchange,提问作者jeancallisti
相关产品推荐
相关产品推荐

