【发布时间】:2020-10-18 15:12:21
【问题描述】:
在使用 TS 扩充模块时,是否可以将 interface 更改为 type?
我想用我自己的一些属性来增强 Material-UI 中的主题。我创建了createPalette.d.ts 文件:
import '@material-ui/core/styles/createPalette';
declare module '@material-ui/core/styles/createPalette' {
export interface PaletteOptions {
neutral?: {
moderate: string;
dark: string;
};
}
export interface Palette {
neutral: {
moderate: string;
dark: string;
};
}
}
PaletteOptions 和 Palette 接口的内容几乎相同,所以我想通过将neutral 提取为外部类型来简化它,并提出如下内容:
import '@material-ui/core/styles/createPalette';
type CustomPalette = {
neutral: {
moderate: string;
dark: string;
};
};
declare module '@material-ui/core/styles/createPalette' {
export interface PaletteOptions extends Partial<CustomPalette> {}
export interface Palette extends CustomPalette {}
}
它可以工作,但 PaletteOptions 和 Palette 现在被视为“空”,并且由于 no-empty-interfaces 规则而出现错误。点击自动修复 ESLint 后将其更改为类型:
import '@material-ui/core/styles/createPalette';
type CustomPalette = {
neutral: {
moderate: string;
dark: string;
};
};
declare module '@material-ui/core/styles/createPalette' {
export type PaletteOptions = Partial<CustomPalette>;
export type Palette = CustomPalette;
}
没有 ESLint 错误,但现在模块扩充不起作用,因为 Material-UI 类型将 PaletteOptions 和 Palette 声明为接口,而 TS 忽略了我的声明。
我现在有什么选择?有什么办法可以诱使 TS 接受 PaletteOptions 和 Palette 是类型,还是我应该按照该规则使用 eslint-ignore?
【问题讨论】:
标签: javascript typescript material-ui