如何解决节点/打字稿:如何确保运行具有副作用的导入?
我正在用打字稿编写节点应用程序。我已经编写了一个类装饰器@myDecorator
,而@myDecorator
的目的是要跟踪它所应用于的所有类。
我的问题:在使用该行为之前,如何确保所有这些装饰类都已加载?一些示例代码将有助于使其更加具体:
-
myDecorator.ts
文件中装饰器的声明:
type ConstructorType = { new (...args: any[]): any };
// keep track of decorated classes
const registeredClasses: Map<string,ConstructorType> = new Map();
// class decorator
export function myDecorator<T extends ConstructorType>(targetConstructor: T) {
// create the modified class
const newClass = class extends targetConstructor { /* ... */ }
// register the modified class
registeredClasses.set(targetConstructor.name,newClass);
// and return it
return newClass;
}
export function doSomethingWithMyDecoratedClasses() {
//... some behavior that relies on `registeredClasses`
}
- 在文件
someClass.ts
中声明修饰的类
import {myDecorator} from 'myDecorator.ts'
@myDecorator
class SomeClass { /* ... */ }
- 在
doSomethingWithMyDecoratedClasses
中使用anotherFile.ts
:
import { doSomethingWithMyDecoratedClasses } from 'myDecorator.ts`
//...
doSomethingWithMyDecoratedClasses()
//...
问题在于,我必须先将SomeClass
添加到registeredClasses
,然后再调用doSomethingWithMyDecoratedClasses
。而且,事实上,我已经在我的应用程序中编写了许多此类,并且我需要确保它们都已注册。
我目前的最佳理解是,我需要在import 'someClass.ts'
中调用anotherFile.ts
(实际上,是在声明修饰类的地方导入 all 文件),所以我真的需要import someClass1.ts
,import someClass2.ts
,...
这是最好/唯一的方法吗?有推荐的方式吗?
解决方法
大多数应用程序都有一个索引文件,负责导入顶级内容。如果您在此处导入doSomethingWithMyDecoratedClasses
,则可以确保所有其他内容都首先导入。
另一种选择是不在模块的根级别调用它,而是等待事件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。