我正在开发一个解析CSV并返回类型化对象数组的函数.它看起来像这样.
type KeyToTransformerLookup<T> = {
[K in keyof T as T[K] extends string ? never : K]: (
stringValue: string
) => T[K];
};
export default function csvToArray<T>(
csv: string,
keys: Array<keyof T>,
keyToTransformerLookup: KeyToTransformerLookup<T>,
ignoreFirstLine = false
): T[] {
const rows = csv.split(/\n(?=.)/);
if (ignoreFirstLine) {
rows.shift();
}
return rows.map((row) => {
const values = row.split(/(?!\B"[^"]*),(?![^"]*"\B)/g);
const rowObject: Record<any, any> = {};
keys.forEach((key, index) => {
const stringValue = values[index];
if (key in keyToTransformerLookup) {
rowObject[key] = keyToTransformerLookup[key](stringValue); // TypeScript complains
return;
}
rowObject[key] = stringValue;
});
return rowObject as T;
});
}
Type 'keyof T' cannot be used to index type 'KeyToTransformerLookup<T>'.
我猜这是因为一旦映射了K in keyof T
,结果类型就不再是keyof T
的部分,而是一个全新的类型.这有点令人沮丧,因为我没有转换键,而且我还在判断keyToTransformerLookup
上是否存在key
,所以我只想找到一种满足TypeScrip的方式来索引keyToTransformerLookup
.