如果另一个属性具有特定值,我如何向接口添加其他属性?例如:
interface IBaseColumn {
name: string
display?: boolean
}
interface ISpecialColumn extends IBaseColumn {
name: 'SpecialColumn'
extraProp?: any
}
export type IColumn = IBaseColumn | ISpecialColumn
// ...
const columns: IColumn[] = [/* ... */]
const column = columns.find(c => c.name === 'SpecialColumn') // IColumn | undefined
如果名称为SpecialColumn
,我希望IBaseColumn
具有其他属性。上面的例子是有效的,但由于columns
的类型是IColumn[]
,所以我用.find
查找的列也是有效的。我找到的唯一解决方法是将列强制转换为ISpecialColumn
,但理想情况下会自动正确推断类型。
您需要类型的防护:
const isSpecialClumn = (column: IColumn): column is ISpecialColumn =>
column.name === 'SpecialColumn'
const column = columns.find(isSpecialClumn) // ISpecialColumn | undefined