如何通过isBrowser常量实现API的条件类型定义?
方案一:无参类型守卫函数(推荐)
把isBrowser改成返回类型谓词的函数,直接对全局API做类型断言,无需每次传参:
// 先声明API的联合类型 declare const API: BrowserAPI | ElectronAPI; // 定义无参类型守卫函数,内置运行时判断逻辑 function isBrowser(): API is BrowserAPI { return typeof window !== 'undefined' && !window.process?.type; }
使用时完全符合你的预期:
API; // 类型为 BrowserAPI | ElectronAPI if (isBrowser()) { API; // 类型自动收窄为 BrowserAPI API.browserOnlyFunction(); // 无类型错误,正常调用 } else { API; // 类型自动收窄为 ElectronAPI API.electronOnlyFunction(); // 无类型错误,正常调用 }
方案二:编译时固定类型(适合环境确定的场景)
如果你的代码在构建阶段就能明确是浏览器还是Electron环境,可以用字面量类型+条件类型实现:
比如在浏览器环境的类型声明文件中:
declare const isBrowser: true; declare const API: BrowserAPI;
在Electron环境的类型声明文件中:
declare const isBrowser: false; declare const API: ElectronAPI;
也可以配合构建工具的预定义变量(比如Vite的define、Webpack的DefinePlugin)动态替换:
declare const isBrowser: boolean; declare const API: typeof isBrowser extends true ? BrowserAPI : ElectronAPI;
这种方式没有运行时判断开销,但需要构建流程配合确定环境。
你之前尝试失败的原因:
- 条件类型失效:
typeof isBrowser是通用boolean类型(不是true/false字面量),条件判断会默认走false分支,导致API始终被推断为ElectronAPI。 - 带参类型守卫冗余:你之前的函数需要传
API参数,但改成无参形式后,直接断言全局变量的类型就解决了冗余问题。
内容的提问来源于stack exchange,提问作者wathhr
相关产品推荐
相关产品推荐

