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
相关产品推荐
相关产品推荐

