javascript - 在 Typescript 中通过模块增强将接口改为类型
在使用 TypeScript 扩展模块时,是否可以将 interface 改为 type?我想在 Material-UI 中通过添加一些我自己的属性来增强 Theme。我创建了 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 将其更改为 types:
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?
答案#1
看起来这个规则假设你没有进行扩展,并且禁用它是安全的,因为你需要另一个接口来扩展现有的接口。