[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.

posted @   Zhentiw  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源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 ?
点击右上角即可分享
微信分享提示