TypeScript如何实现优先使用全局类型、不存在时回退到本地类型
实现方案
核心通过 TypeScript 条件类型探测全局对象上的类定义,不存在则自动回退到兜底类型,以下是最简实现:
class MyClass {} // 核心类型逻辑 type ResolvedClass = typeof globalThis extends { SomeClass: abstract new (...args: any[]) => infer InstanceType } ? InstanceType : MyClass;
如果需要复用该逻辑,可以封装为通用泛型工具:
type GlobalClassFallback<GlobalClassName extends string, FallbackType> = typeof globalThis extends { [K in GlobalClassName]: abstract new (...args: any[]) => infer T } ? T : FallbackType; // 调用示例 type ResolvedClass = GlobalClassFallback<'SomeClass', MyClass>
场景验证
场景1:全局存在SomeClass定义
此时ResolvedClass会自动解析为SomeClass:
declare global { class SomeClass {} } class MyClass {} type ResolvedClass = GlobalClassFallback<'SomeClass', MyClass> // ResolvedClass 等价于 SomeClass,符合预期
场景2:全局不存在SomeClass定义
此时ResolvedClass会自动回退为MyClass:
class MyClass {} type ResolvedClass = GlobalClassFallback<'SomeClass', MyClass> // ResolvedClass 等价于 MyClass,符合预期
配套导出API
你提供的运行时实现可以和上述类型完全对齐,无需额外修改:
export const value: ResolvedClass = new ((globalThis as any).SomeClass ?? MyClass)();
用户使用该导出值时,会自动适配当前环境的全局类型定义,不存在时也能拿到MyClass的类型提示。
内容的提问来源于stack exchange,提问作者David Sherret
相关产品推荐
相关产品推荐

