在 TypeScript 中,你可以使用映射类型(Mapped Types)结合 `Record` 或 `as const` 来实现这个需求。你可以定义一个具体的类型,该类型的键是 `EVENT_UPDATE_WINDOW_DATA`、`EVENT_A` 和 `EVENT_B`,而值是 `BrowserWindow[]`。这里有两种方法来实现:
### 方法一:使用 `as const` 和 `Record`
你可以使用 `as const` 来确保常量数组是只读且类型被正确推断为字面量类型,然后使用 `Record` 来创建一个映射类型。
import { BrowserWindow } from 'electron';
import { EVENT_UPDATE_WINDOW_DATA, EVENT_A, EVENT_B } from '@main/constants/';
type EventTypes = typeof EVENT_UPDATE_WINDOW_DATA | typeof EVENT_A | typeof EVENT_B;
type IEventSubscribedWindow = Record<EventTypes, BrowserWindow[]>;
// 使用示例
const subscribedWindows: IEventSubscribedWindow = {
[EVENT_UPDATE_WINDOW_DATA]: [],
[EVENT_A]: [],
[EVENT_B]: []
};
### 方法二:使用映射类型和字面量联合类型
你也可以直接在接口中使用字面量联合类型作为键:
import { BrowserWindow } from 'electron';
import { EVENT_UPDATE_WINDOW_DATA, EVENT_A, EVENT_B } from '@main/constants/';
type EventKeys = EVENT_UPDATE_WINDOW_DATA | EVENT_A | EVENT_B;
interface IEventSubscribedWindow {
[key in EventKeys]: BrowserWindow[];
}
// 使用示例
const subscribedWindows: IEventSubscribedWindow = {
[EVENT_UPDATE_WINDOW_DATA]: [],
[EVENT_A]: [],
[EVENT_B]: []
};
这两种方法都能确保 `IEventSubscribedWindow` 接口的键只能是 `EVENT_UPDATE_WINDOW_DATA`、`EVENT_A` 和 `EVENT_B` 中的一个,而值则是 `BrowserWindow[]`。