javascript - 在 Typescript 中使用模块扩充将接口更改为类型
问题描述
使用 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 - 将 JavaScript ArrayBuffer 中的 .NET 十进制格式 (System.Decimal) 转换为 JavaScript 中的 JavaScript 数字
- c# - 防止人们输入任何其他内容然后 [Y 或 N]
- r - 从 R 中每一行的唯一代码中提取某些字母,仅使用 tidyverse
- azure - Azure Monitor (Application Insights) 日志查询图表 - Y 轴上有什么?
- sql - 无法使用 REPLACE 格式化 CROSS APPLY 以修复地址
- gateway - Azure IoT Edge 离线功能
- python - Python 2 中 Sha1 的默认编码是什么?
- python - 使用稀疏列对 pandas.DataFrame 中的行进行基于索引的访问
- react-native - 应用程序因 react-native-beacons-manager 崩溃
- .net - 在没有重复成员的情况下实现通用和非通用接口