微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

节点/打字稿:如何确保运行具有副作用的导入?

如何解决节点/打字稿:如何确保运行具有副作用的导入?

我正在用打字稿编写节点应用程序。我已经编写了一个类装饰器@myDecorator,而@myDecorator的目的是要跟踪它所应用于的所有类。

我的问题:在使用该行为之前,如何确保所有这些装饰类都已加载?一些示例代码将有助于使其更加具体:

  1. 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`
}
  1. 文件someClass.ts中声明修饰的类
import {myDecorator} from 'myDecorator.ts'

@myDecorator
class SomeClass { /* ... */ }
  1. doSomethingWithMyDecoratedClasses中使用anotherFile.ts
import { doSomethingWithMyDecoratedClasses } from 'myDecorator.ts`
//...
doSomethingWithMyDecoratedClasses()
//...

问题在于,我必须先将SomeClass添加registeredClasses,然后再调用doSomethingWithMyDecoratedClasses。而且,事实上,我已经在我的应用程序中编写了许多此类,并且我需要确保它们都已注册

我目前的最佳理解是,我需要在import 'someClass.ts'调用anotherFile.ts(实际上,是在声明修饰类的地方导入 all 文件),所以我真的需要import someClass1.tsimport someClass2.ts,...

这是最好/唯一的方法吗?有推荐的方式吗?

解决方法

大多数应用程序都有一个索引文件,负责导入顶级内容。如果您在此处导入doSomethingWithMyDecoratedClasses,则可以确保所有其他内容都首先导入。

另一种选择是不在模块的根级别调用它,而是等待事件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。