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

如何在Node与客户端共享的TypeScript代码中使用通用JS函数?

跨Node/客户端共享代码中通用JS函数的类型解决方案

核心思路是让TypeScript根据运行环境自动匹配对应类型,同时避开重复声明或强制绑定单一环境类型的问题,下面是几种实用方案:

方案1:条件类型声明适配环境

在共享代码的全局声明文件里,通过环境判断来动态绑定类型,避免冲突:

declare global {
  const setTimeout: typeof window extends undefined 
    ? import('timers').setTimeout 
    : typeof window.setTimeout;
}

TypeScript会自动检测当前环境是否存在window,分别匹配Node或客户端的setTimeout类型,不会触发重复声明错误。

方案2:拆分TS配置文件

为Node和客户端分别创建独立的tsconfig.json,各自指定对应环境的类型依赖:

  • 客户端配置(tsconfig.client.json):
{
  "compilerOptions": {
    "lib": ["ESNext", "DOM"],
    // 其他编译配置
  },
  "include": ["src/client/**/*", "src/shared/**/*"]
}
  • Node端配置(tsconfig.node.json):
{
  "compilerOptions": {
    "lib": ["ESNext"],
    "types": ["node"],
    // 其他编译配置
  },
  "include": ["src/node/**/*", "src/shared/**/*"]
}

共享代码不需要额外写类型声明,TypeScript会根据当前使用的配置文件,自动加载对应环境的类型定义,自然识别setTimeout这类函数。

方案3:自定义通用类型声明

如果不需要完整的环境类型,仅需要基础函数类型支持,可以在共享目录下新建shared-types.d.ts,手动声明通用版本:

declare function setTimeout(
  callback: (...args: any[]) => void,
  delay?: number,
  ...args: any[]
): number | NodeJS.Timeout;

这种方式最轻量化,完全避开环境类型冲突,适合只需要基础类型校验的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:33:23