我正在解析CSV,并希望将行转换为对象。它看起来像这样:
function dataToObjects<T extends SomeBasicObjectType>(data: string[][]): T[] {
const [rawHeaders, ...rows] = data
const headers = rawHeaders as Array<keyof T>
const dataAsObjects = rows.map((row) => {
const dataObject = Partial<T> = {}
row.forEach((dataPoint, idx) => {
// TypeScript is fine with this next line
const header = headers[idx] as keyof T
if (!header) {
// throw some error
}
// Below presents the type error: Type 'string' is not assignable to type 'T[keyof T]'
dataObject[header] = dataPoint
})
return dataObject
})
return dataAsObjects
}
试图保持示例代码尽可能简单(并包括错误点作为注释),所以请原谅我,如果它不是很完美。正如你可能会说的,这个样本也是来自我试图尽可能多地解决问题(即。
你可以像在TypeScript Playground上一样尝试这段代码(我相信它就是这样)来查看错误。
OP解决方案
对于如何最恰当地解决这个问题,我当然愿意听取意见。检查DB客户端如何转换查询的结果,而TS同样无法确认结果是预期的类型。
同时,满足以下条件:
row.forEach((dataPoint, idx) => {
const header = headers[idx]
if (!header) {
// throw some error
}
dataObject[header] = dataPoint
})
// Cast to `unknown` prior to casting as `T`
return dataObject as unknown as T
不相信这是理想的足够,但它在紧要关头工作。