日期: 2025-10-22
状态: ⚠️ fmode-ng 包设计问题
问题类型: TypeScript 模块解析限制
✅ 所有依赖版本均一致且正确:
package.json 要求: fmode-ng@^0.0.224
node_modules 实际: fmode-ng@0.0.224 ✓
TypeScript: 5.4.5
Angular: 17.3.0
结论: 不是版本不一致问题。
// 错误 1: 类只能作为类型使用
'WxworkSDK' only refers to a type, but is being used as a value here.
'WxworkCorp' only refers to a type, but is being used as a value here.
// 错误 2: 模块声明但未导出
Module '"fmode-ng/core"' declares 'FmodeParse' locally, but it is not exported.
fmode-ng/core/index.d.ts:
export * from "./agent";
export * from "./voice";
export * from "./parse";
export * from "./social";
export * from "./storage";
fmode-ng/core/social/index.d.ts:
export * from "./wxwork/wxwork.corp";
export * from "./wxwork/wxwork.sdk";
export * from "./wxwork/wxwork.auth";
fmode-ng/core/parse/fmode.parse.d.ts:
declare class FmodeParse { /* ... */ }
declare const defaultExport: typeof FmodeParse;
export { FmodeParse as default, defaultExport as FmodeParse };
TypeScript 在处理多层 export * 时,无法正确识别导出的类作为可实例化的值,特别是当:
export *default export 和命名导出混用.d.ts) 中重新导出这是 TypeScript 的已知限制,不是 bug。
declare module 'fmode-ng/core' {
import { FmodeParse } from 'fmode-ng/core';
export { FmodeParse };
}
结果: 导致 "declares locally, but is not exported" 错误
declare module 'fmode-ng/core' {
export { WxworkAuth, WxworkCorp } from 'fmode-ng/core/social';
}
结果: 类仍然只能作为类型使用,不能实例化
{
"paths": {
"fmode-ng/core": ["./src/app/utils/fmode-exports.ts"]
}
}
结果: Angular 的模块解析机制与之冲突
import { WxworkSDK } from 'fmode-ng/lib/core/social/wxwork/wxwork.sdk';
结果: TypeScript 无法找到模块(package.json 的 exports 未配置)
// fmode-ng-exports.ts
export { WxworkSDK } from 'fmode-ng/social';
结果: 从 fmode-ng/social 导出仍然只能作为类型
fmode-ng 使用了不兼容 TypeScript 严格模块解析的导出模式:
过度使用 export *
混合 default 和命名导出
export { FmodeParse as default, defaultExport as FmodeParse };
这种模式在多层 export * 中会导致问题
缺少统一的导出入口
fmode-ng/core/all 这样的显式导出文件export * 的隐式导出TypeScript 5.4.5 在以下情况下无法正确识别值导出:
import { X } from 'pkg/module'; (如果 pkg/module 直接导出)import { X } from 'pkg'; (如果 pkg 通过 export * from 'pkg/module')declare module { export { X } from ... }// ✅ 从子模块导入
import { FmodeParse } from 'fmode-ng/parse';
import { WxworkAuth } from 'fmode-ng/social';
// ❌ 从主模块导入
import { FmodeParse } from 'fmode-ng/core';
限制: WxworkSDK 和 WxworkCorp 从 fmode-ng/social 导入仍然不能实例化。
建议改进:
提供显式导出文件:
// fmode-ng/core/all.ts
export { FmodeParse } from './parse/fmode.parse';
export { WxworkAuth } from './social/wxwork/wxwork.auth';
// ... 所有导出
避免过度使用 export *
使用一致的导出模式(只用命名导出,避免 default)
如果官方长期不更新,可以:
fmode-ng/core/all 导出文件由于这是 fmode-ng 包本身的设计问题,无法通过项目代码完全解决。
保留当前的增强文件(仅扩展接口方法)
// src/fmode-ng-augmentation.d.ts
declare module 'fmode-ng/social' {
interface WxworkCorp {
// 添加缺失的方法
}
}
从子模块导入(尽可能)
import { FmodeParse } from 'fmode-ng/parse'; // ✓
import { WxworkAuth } from 'fmode-ng/social'; // ⚠️ 部分有效
接受部分 TypeScript 错误
tsconfig.json 中添加 "skipLibCheck": true 可以忽略第三方包的类型错误✅ 运行时功能不受影响
⚠️ 开发体验受影响
问题根源: fmode-ng@0.0.224 包的导出设计与 TypeScript 5.4.5 的模块解析机制不完全兼容。
责任方: fmode-ng 包(不是项目代码问题,不是版本不一致问题)
建议:
影响:
文档版本: 1.0
最后更新: 2025-10-22
诊断人员: Claude AI Assistant