Mongoose两模型geometry赋值报错:无法将number[]分配给[[number]]
解决Mongoose模型间Geometry类型不匹配的赋值问题
首先明确两个模型的coordinates类型差异:
- 第一个模型要求
coordinates为二维数组:[[number]](数组的每个元素都是数字数组) - 第二个模型的
coordinates定义为[type: [number]],本质是元素为数字数组的数组(和第一个模型的类型逻辑一致,但你用flatMap处理后错误地将其拍平成了一维数组number[],导致类型不匹配报错)
具体解决方法分以下几种场景:
场景1:第二个模型的coordinates本身就是二维结构
如果client.geometry.coordinates的结构已经是[[number]](比如[[116.39, 39.9], [116.4, 39.91]]),直接赋值即可,不需要flatMap处理:
geometry: { type: client.geometry.type, coordinates: client.geometry.coordinates }
场景2:第二个模型的coordinates是一维数组,需要转成二维数组
如果client.geometry.coordinates是一维数组(比如[116.39, 39.9]),需要将其包裹在一个数组中,转换成第一个模型要求的二维结构:
geometry: { type: client.geometry.type, coordinates: client.geometry.coordinates ? [client.geometry.coordinates] : undefined }
场景3:第二个模型的coordinates是三维数组,需要拍平一层
如果client.geometry.coordinates是三维数组(比如[[[116.39, 39.9], [116.4, 39.91]]]),需要拍平一层得到二维数组,此时可以用flat()(更直观)或flatMap:
// 使用flat()拍平一层 geometry: { type: client.geometry.type, coordinates: client.geometry.coordinates?.flat() } // 或使用flatMap,效果和flat()一致 geometry: { type: client.geometry.type, coordinates: client.geometry.coordinates?.flatMap(item => item) }
类型断言(针对TypeScript类型推断问题)
如果上述方法仍存在类型提示错误,可以用类型断言明确指定类型:
geometry: { type: client.geometry.type, coordinates: client.geometry.coordinates?.flatMap(item => item) as [[number]] | undefined }
错误原因说明
你之前使用flatMap((coordinates) => coordinates)会将二维数组直接拍平成一维数组(比如[[1,2],[3,4]]会变成[1,2,3,4]),而第一个模型要求的是二维数组[[number]],因此触发类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Black-Badger
相关产品推荐
相关产品推荐

