出现 `Cannot find namespace 'message'` 错误,是因为 TypeScript 无法识别你导入的 `message` 模块,通常是因为类型定义缺失或模块导出方式不正确。
---
### ✅ 常见原因及解决办法
#### 1. **封装的 `message.ts` 文件没有正确的类型定义**
如果你使用的是如下方式导入:
```ts
import message from '../utils/message';
```
你需要确保 `message.ts` 文件中使用的是 **默认导出(default export)**。
---
### ✅ 解决方案:确保导出方式正确
#### ✅ `message.ts` 正确写法(使用默认导出)
```ts
import { getMessageInstance } from '../components/GlobalMessageProvider';
type MessageType = 'success' | 'error' | 'info' | 'warning' | 'loading';
const DEFAULT_DURATION = 3;
const showMessage = (type: MessageType, content: string, duration?: number) => {
const instance = getMessageInstance();
if (!instance) {
console.warn('Message instance is not initialized yet.');
return;
}
instance[type](content, duration ?? DEFAULT_DURATION);
};
// 使用默认导出
export default {
success: (content: string, duration?: number) => showMessage('success', content, duration),
error: (content: string, duration?: number) => showMessage('error', content, duration),
info: (content: string, duration?: number) => showMessage('info', content, duration),
warning: (content: string, duration?: number) => showMessage('warning', content, duration),
loading: (content: string, duration?: number) => showMessage('loading', content, duration),
destroy: () => getMessageInstance()?.destroy(),
};
```
---
#### ✅ 在 `message.d.ts` 中添加类型定义(可选)
你可以手动添加类型定义,以避免 TypeScript 报错:
```ts
// message.d.ts
import { MessageInstance } from 'antd/es/message/interface';
declare const message: {
success: (content: string, duration?: number) => void;
error: (content: string, duration?: number) => void;
info: (content: string, duration?: number) => void;
warning: (content: string, duration?: number) => void;
loading: (content: string, duration?: number) => void;
destroy: () => void;
};
export default message;
```
---
### ✅ 另一种写法:命名导出 + 命名导入(推荐用于类型安全)
#### `message.ts`
```ts
import { getMessageInstance } from '../components/GlobalMessageProvider';
type MessageType = 'success' | 'error' | 'info' | 'warning' | 'loading';
const DEFAULT_DURATION = 3;
const showMessage = (type: MessageType, content: string, duration?: number) => {
const instance = getMessageInstance();
if (!instance) {
console.warn('Message instance is not initialized yet.');
return;
}
instance[type](content, duration ?? DEFAULT_DURATION);
};
export const success = (content: string, duration?: number) => showMessage('success', content, duration);
export const error = (content: string, duration?: number) => showMessage('error', content, duration);
export const info = (content: string, duration?: number) => showMessage('info', content, duration);
export const warning = (content: string, duration?: number) => showMessage('warning', content, duration);
export const loading = (content: string, duration?: number) => showMessage('loading', content, duration);
export const destroy = () => getMessageInstance()?.destroy();
```
#### 使用方式
```ts
import { success, error } from '../utils/message';
success('操作成功');
error('网络错误');
```
---
### ✅ 最终建议:使用命名导出 + 类型定义
如果你希望 TypeScript 完全识别 `message` 的类型,可以这样做:
#### 1. 创建 `types/message.d.ts`
```ts
declare module '../utils/message' {
export function success(content: string, duration?: number): void;
export function error(content: string, duration?: number): void;
export function info(content: string, duration?: number): void;
export function warning(content: string, duration?: number): void;
export function loading(content: string, duration?: number): void;
export function destroy(): void;
}
```
这样 TypeScript 就能识别你模块的类型。
---
### ✅ 总结
| 问题 | 原因 | 解决方法 |
|------|------|-----------|
| `Cannot find namespace 'message'` | 导入方式与导出方式不一致 | 确保使用 `default export` 或 `named export` 并配合正确的导入方式 |
| 类型报错 | 缺少类型定义 | 添加 `.d.ts` 类型定义文件 |
| 推荐方式 | 使用命名导出+类型定义 | 更好的类型提示和 IDE 支持 |
---
###