[TS] 扩展 sdk 内部的类型

199 阅读1分钟

sdk 可设计专属 interface 用于约束外部的扩展。

【案例】

  • 假设存在名为 "@sdk" 的包,定义了 "TType" 内部类型
  • 需求:在项目逻辑中,需扩展 "@sdk" 的 "TType"
    • 场景:sdk 支持外部注册某些功能

【方案】

  • sdk 需提供类型定义文件 (".d.ts" 文件)
  • 在项目中使用 declare 进行扩展定义 (仅支持 interface)

【实现】

  • @sdk 要被扩展的类型设计
// 约束可扩展的类型
type ExtendableTypes = 'TType';
// 外部使用扩展定义接口
export interface CustomTypes {
  [key: string]: unknown;
}
/*
 * ExtendedType 是一个泛型类型别名。它接受两个类型参数 K 和 B。K 必须是 ExtendableTypes 类型,也就是说 K 只能是 'TType'。B 可以是任何类型。
 * ExtendedType 的类型取决于 CustomTypes[K]。如果 CustomTypes[K] 是 unknown 类型,那么 ExtendedType 就是 B 类型。否则,ExtendedType 是 CustomTypes[K] 和 B 的联合类型。
 */
type ExtendedType<
  K extends ExtendableTypes,
  B
> = unknown extends CustomTypes[K] ? B : CustomTypes[K] | B;

// @sdk TType 定义
type BaseType = 'a' | 'b'
export TType = ExtendedType<'TType' | BaseType>

// 构建的 @sdk .d.ts 文件包含 CustomTypes
  • 项目逻辑中,扩展 sdk 的类型
import { TType } from '@sdk';

// 注:需要在局部并 import 之后定义,要不会覆盖包的原始类型
declare module '@sdk' {
  interface CustomTypes {
    TType: 'c';
  }
}

// 此时 TType 的类型为 'a' | 'b' | 'c'