以下是重现此问题的最小代码量:
const map = {
FOO: 'foo',
BAR: 'bar',
} as const
export const CSV_COLUMNS_ALL = Object.values(map)
export type ColumnName = typeof CSV_COLUMNS_ALL[number]
export type RowField<CN extends ColumnName> = {
/** The Original value from the CSV file */
original: string
/** The row index for the csv row that this field belongs to */
rowIndex: number
/** The header text in the CSV for this column of data */
columnName: CN
}
export type CsvRow = {
[k in ColumnName]?: RowField<k>
} & {
index: number
}
const row:CsvRow = CSV_COLUMNS_ALL.reduce((row, columnName) => {
row[columnName] = { columnName, original: '', rowIndex: 1 }
return row
}, { index: 1 } as CsvRow)
这里是Playground
这句台词是这样的:
row[columnName] = { columnName, original: '', rowIndex: 1 }
它基本上告诉我不能将此值赋给类型“undefined”
但是row
的类型是CsvRow
,而columnName
的类型是ColumnName
,这应该是一个可赋值的属性,其可选类型是RowField<ColumnName>
,它满足。
那么,为什么它阻止了我,我该如何解决它?
2条答案
按热度按时间cfh9epnr1#
还不能找出这个问题,但我有一个建议,另一种方法来做它似乎是工作与 typescript 罚款:
基本上展开
row
参数对象并添加新属性。将其全部保存在row
参数中。去操场看看吧
wkyowqbh2#
还有一个建议是不泛化RowField类型,这会使错误消失,请查看playground。
不知道为什么会发生这种情况,发现另一个类似的question,表明属性冲突。也许更有经验的开发人员可以解释这是怎么回事。