TypeScript无法分配给可选属性“”不能分配给未定义的类型“”

hivapdat  于 2023-03-13  发布在  TypeScript
关注(0)|答案(2)|浏览(251)

以下是重现此问题的最小代码量:

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>,它满足。
那么,为什么它阻止了我,我该如何解决它?

cfh9epnr

cfh9epnr1#

还不能找出这个问题,但我有一个建议,另一种方法来做它似乎是工作与 typescript 罚款:

row = {...row, [columnName]: { columnName, original: '', rowIndex: 1 }}

基本上展开row参数对象并添加新属性。将其全部保存在row参数中。
去操场看看吧

wkyowqbh

wkyowqbh2#

还有一个建议是不泛化RowField类型,这会使错误消失,请查看playground。

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 = {
  /** 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: ColumnName
}

export type CsvRow = {
  [k in ColumnName]?: RowField
} & {
  index: number
}

const row:CsvRow = CSV_COLUMNS_ALL.reduce((row, columnName) => {
  row[columnName] = { columnName, original: '', rowIndex: 1 } ;
return row
}, { index: 1 } as CsvRow)

不知道为什么会发生这种情况,发现另一个类似的question,表明属性冲突。也许更有经验的开发人员可以解释这是怎么回事。

相关问题