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

TypeScript模块导出函数与类型的正确方式咨询(TS2.7/Node9)

TypeScript 2.7 中模块导出函数与类型的正确姿势(适配Node.js 9)

嘿,我太懂这种纠结了——早期TypeScript版本的模块类型规则确实容易让人摸不着头脑,结合你偏好@types文件夹和d.ts的习惯,我给你梳理下最贴合你场景的方案:

一、模块A的导出方式(函数+类型)

1. 函数的导出(常规操作)

在模块A的实现文件(比如a.ts)里,直接用export关键字导出函数就行,和普通JS模块一致:

// a.ts
// 这里可以直接用d.ts里声明的类型,无需导入
export function sendMessage(msg: Message): void {
  console.log(`收到消息:${msg.message}`);
}

2. 类型的导出(适配你的d.ts偏好)

你不想在使用时导入类型,那重点就放在@types文件夹的d.ts声明上,分两种场景:

场景1:模块专属类型(推荐,无冲突)

在项目根目录的@types/a/index.d.ts里,给模块A做类型声明:

// @types/a/index.d.ts
declare module 'a' {
  // 声明模块A的专属类型
  export type Message = {
    message: string;
  };

  // 同步声明导出的函数类型,和a.ts里的实现对应
  export function sendMessage(msg: Message): void;
}

这种方式下,类型是绑定到模块A的,不会污染全局命名空间。

场景2:全局通用类型(无需导入,但有冲突风险)

如果这个Message类型是多个模块都会用到的通用类型,你可以把它声明为全局类型,这样所有文件都能直接用,不用导入:

// @types/global.d.ts
declare type Message = {
  message: string;
};

⚠️ 注意:这种方式容易出现命名冲突,只适合非常通用、不会重名的类型。

二、模块B的使用方式

1. 使用导出的函数

直接导入函数即可,TypeScript会自动关联d.ts里的类型定义:

// b.ts
import { sendMessage } from 'a';

2. 使用类型(对应两种场景)

  • 如果是模块专属类型:因为TypeScript 2.7还没有import type语法,你需要通过模块导入来访问类型,或者用整个模块的命名空间:
    // 方式1:和函数一起导入类型
    import { sendMessage, Message } from 'a';
    const myMsg: Message = { message: 'Hello 模块A!' };
    
    // 方式2:导入整个模块,通过模块名访问类型
    import * as A from 'a';
    const myMsg: A.Message = { message: 'Hello 模块A!' };
    
  • 如果是全局类型:直接用就行,完全不用导入:
    const myMsg: Message = { message: 'Hello 全局类型!' };
    

三、关键配置检查

确保你的tsconfig.json里的配置正确,不然d.ts可能不生效:

{
  "compilerOptions": {
    // 确保typeRoots包含你的本地@types文件夹
    "typeRoots": ["./node_modules/@types", "./@types"],
    // 开启严格类型检查,避免隐式any
    "noImplicitAny": true,
    // 适配Node.js模块系统
    "module": "commonjs",
    "target": "es5" // Node.js 9支持es5及以上
  }
}

另外,如果模块A是你自己的本地模块,记得在它的package.json里加上types字段,指向你的d.ts文件:

{
  "types": "./@types/a/index.d.ts"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:24:14