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'