我正在开发 VSCode 的扩展,并且具有 .NET 背景,希望保持代码库结构良好并将每个接口/类保留在自己的文件中:
- src
- logging
ilogger.ts
iloggerFactory.ts
loggerFactory.ts
文件
/src/logging/ilogger.ts
:
import * as winston from "winston";
export const ILogger = Symbol('ILogger');
export interface ILogger extends winston.Logger { }
文件
/src/logging/iloggerfactory.ts
:
import { ILogger } from "./logger";
export const ILoggerFactory = Symbol('ILoggerFactory');
export interface ILoggerFactory {
createLogger(className: string): ILogger;
}
这可行,但需要在使用日志目录中的任何内容的每个位置添加导入到特定文件:
import { ILogger } from './logging/ilogger';
这不太理想,因为我希望“日志记录”起到类似于 C# 中的命名空间的作用。
这就是
/src/logging/index.ts
的用武之地:
import { ILogger } from './ilogger';
import { ILoggerFactory } from './iloggerFactory';
export { ILogger, ILoggerFactory };
现在我可以写的大部分内容是:
import { ILogger, ILoggerFactory } from './logging';
但是,根据您写入导入的文件的位置,您似乎会导入不同的符号:
文件:
/src/bootstrapper.ts
import { ILoggerFactory as logging_ILoggerFactory } from "./logging";
import { ILoggerFactory as factory_ILoggerFactory } from "./logging/iloggerfactory";
console.log(logging_ILoggerFactory === factory_ILoggerFactory ); // outputs 'false'
文件:
/src/logging/loggerFactory.ts
:
import { ILoggerFactory as logging_ILoggerFactory } from ".";
import { ILoggerFactory as factory_ILoggerFactory } from "./iloggerfactory";
console.log(logging_ILoggerFactory === factory_ILoggerFactory); // outputs 'true'
我的意思是,我只想在任何地方使用
/src/logging/index.ts
,但我不能,因为 /src/logging/loggerFactory.ts
只能从 ILoggerFactory
导入 /src/logging/iloggerfactory.ts
。
理想情况下,我希望
console.log(logging_ILoggerFactory === factory_ILoggerFactory);
是 true
并从 ILoggerFactory
导入 index.ts
,无论位置如何。
我做错了什么?有真正的打字稿方法吗?
您是否可能遇到循环依赖?
我认为这种“OOP 优先”的代码组织方式可能不是 TypeScript 的最佳选择。接口之类的东西确实存在,但并没有像您在 .NET 或 Java 中所期望的那样完全实现。
这就是我要做的:
文件
src/logging.ts
import * as winston from "winston";
export const LoggerFactory = {
function createLogger(className: string) {
return winston.createLogger({
// logger options go here
});
}
}
这可以让你像这样导入工厂:
import { LoggerFactory } from 'src/logging'
const logger = LoggerFactory.createLogger("MyClass")
请注意,
LoggerFactory
和logger
都将被隐式键入,因为winston.createLogger
已由winston库的作者进行了类型注释。
这非常有用,因为即使您自己没有指定单个类型,您也在编写类型安全的代码——TypeScript 正在为您完成这项工作。