如何覆盖对象特定键的值类型?

时间:2017-05-12 17:26:59

标签: typescript

我正在努力改进xlsx库的输入。我有以下定义:

export interface IWorkSheet {
    [cell: string]: IWorkSheetCell;
}

但是,IWorkSheet的某些键用于不是IWorkSheetCell的元数据;例如,!mergesIRange的数组。因此,我尝试以下定义:

export interface IWorkSheet {
    [cell: string]: IWorkSheetCell;
    ['!merges']?: IRange[];
}

不幸的是,这导致错误“类型为['!merges']'的属性'IRange[]'无法分配给IWorkSheetCell类型。”我可以通过将其声明为IWorkSheetCell | any来解决这个问题,但这会破坏自动完成并且不会真正反映声明的意图。

如何声明对象的默认值类型,然后为特定键覆盖它?

1 个答案:

答案 0 :(得分:3)

您不能使用interface,但使用intersection type

type IWorkSheet = {
    [cell: string]: IWorkSheetCell;
} & {
    ['!merges']?: IRange[];
}

或者:

interface IWorkSheet {
    [cell: string]: IWorkSheetCell;
}

type IWorkSheetMerges = IWorkSheet & { ['!merges']?: IRange[]; }