[Typescript] Declaring Globals for a Library
file1:
import { expect, it } from "vitest";
/**
* Here, we've actually got _multiple_ problem files!
* Make sure to to check problem.2.ts too.
*/
declare global {
interface DispatchableEvent {
LOG_IN: {
username: string;
password: string;
};
}
/**
* This type converts the DispatchableEvent
* interface into a union:
*
* { type: 'LOG_IN'; username: string; password: string; }
*/
type UnionOfDispatchableEvents = {
[K in keyof DispatchableEvent]: {
type: K;
} & DispatchableEvent[K];
}[keyof DispatchableEvent];
}
const dispatchEvent = (event: UnionOfDispatchableEvents) => {
// Imagine that this function dispatches this event
// to a global handler
};
it("Should be able to dispatch a LOG_IN and LOG_OUT event", () => {
dispatchEvent({ type: "LOG_IN", username: "username", password: "password" });
dispatchEvent({ type: "LOG_OUT" });
});
file2:
import { expect, it } from 'vitest';
declare global {
interface DispatchableEvent {
LOG_OUT: {};
UPDATE_USERNAME: {
username: string;
};
}
}
const handler = (event: UnionOfDispatchableEvents) => {
switch (event.type) {
case 'LOG_OUT':
console.log('LOG_OUT');
break;
case 'UPDATE_USERNAME':
console.log(event.username);
break;
}
};
it('Should be able to handle LOG_OUT and UPDATE_USERNAME events', () => {
handler({ type: 'LOG_OUT' });
handler({ type: 'UPDATE_USERNAME', username: 'matt' });
});
Both file we have:
declare global {
interface DispatchableEvent {}
}
This approach also works well in a library setting.
When you use declare global
inside your library, it means that users can override an interface that you've declared in the global.
This provides a way of passing down information or letting users pass your library information.
Think about global
as a way to communicate between files that don't necessarily import or export to each other.
When you use it like this, you can actually end up with a really nice API.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2021-02-10 [Typescript] Create Type From Any Given Data in TypeScript
2021-02-10 [Typescript] Ignore Null or Undefined Values with TypeScript Non-Null Assertion Operator
2020-02-10 [Algorithm] 226. Invert Binary Tree
2020-02-10 [Unit Testing] Jasmine Spies
2019-02-10 [HTML5] Build Flexible HTML with HTMLTemplates using Slots and Web Components
2017-02-10 [Typescript] What is a Function Type ? Function Types and Interfaces - Are They Related ?