You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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;

这种方式没有运行时判断开销,但需要构建流程配合确定环境。


你之前尝试失败的原因:

  1. 条件类型失效:typeof isBrowser是通用boolean类型(不是true/false字面量),条件判断会默认走false分支,导致API始终被推断为ElectronAPI。
  2. 带参类型守卫冗余:你之前的函数需要传API参数,但改成无参形式后,直接断言全局变量的类型就解决了冗余问题。

内容的提问来源于stack exchange,提问作者wathhr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:05:13