TypeScript中交叉类型数组map时类型丢失问题求助
问题描述
我定义了GetAllNegoRequestResponseItem类型与{ expiry: any }类型,通过&交叉组合后,将negotiations定义为(GetAllNegoRequestResponseItem & { expiry: any }[]) | undefined,即该变量为交叉类型的数组或undefined。但当使用negotiations?.map((nego) => nego.iAmLookingPropertiesFromGetAllNegoReq...)遍历数组时,nego的类型仅被识别为{ expiry: any },而非预期的交叉组合类型,请问是否存在类型误用问题?
问题分析与解决
这是典型的括号位置错误导致的类型优先级误用。
你当前的类型定义中,数组符号[]紧跟在{ expiry: any }之后,结合TypeScript的类型优先级规则,会先解析{ expiry: any }[](即{ expiry: any }类型的数组),再和GetAllNegoRequestResponseItem做交叉运算。这就导致negotiations的实际类型变成了「既是GetAllNegoRequestResponseItem类型,又是{ expiry: any }数组」的矛盾类型,完全偏离了你想要的「交叉类型组成的数组」的预期。
正确的写法应该把数组符号[]套在整个交叉类型的外面:
(GetAllNegoRequestResponseItem & { expiry: any })[] | undefined
这样定义后,TypeScript就能正确识别:negotiations是由GetAllNegoRequestResponseItem和{ expiry: any }交叉后的完整类型组成的数组,或者是undefined。此时用negotiations?.map遍历,nego就会被正确推断为交叉后的完整类型,你也能正常访问GetAllNegoRequestResponseItem中的属性了。
内容的提问来源于stack exchange,提问作者Aljohn Yamaro

