Я пытаюсь создать инструментарий для нашего проекта. Он состоит из обработчика, который содержит список актеров. Когда любое действие отправляется в реакции, все участники, зарегистрированные в промежуточном программном обеспечении инструментария, передают это действие для выполнения.
Я хочу разбить все классы этой реализации в модуле и ссылаться на него таким образом, чтобы не требовалось индивидуально импортировать классы / интерфейс.
Проблема в том, что когда я объявляю локальный модуль и пытаюсь импортировать его как модуль, ошибки компиляции не возникает. Если я использую какой-либо интерфейс, определенный в модуле, я могу реализовать его, однако, если я пытаюсь расширить любой класс, определенный в модуле, выдает ошибку «Модуль не найден»
import * as A from 'instrumentation'
export class TestActor extends A.BaseActor {
constructor(actorName: string) {
super(actorName);
}
}
Ошибка - Модуль не найден: Ошибка - Не удалось разрешить приборы
Если я вместо этого попробую что-то вроде: -
export class TestActor implements A.ActionHandler {}
Нет такой ошибки, модуль не найден.
Сейчас я использую инструментарий локально, но позже захочу экспортировать его как библиотеку.
в настоящее время добавлены custom_typings для этого модуля и указаны typeRoots в tsconfig.
Все классы и интерфейсы ниже:
declare module 'instrumentation' {
export interface ActionHandler {
(action: any): void;
}
export class BaseActor {
constructor(actorName: string);
//Map of action to all handlers for an action
actionHandlers: Map<string, Array<ActionHandler>>;
actorName: string;
//Registers all handlers against the actions provided by the actor
AddActions(actionName: string, actions : Array<string>, customHandler: ActionHandler);
//Executes all the handlers for action in the sequence they are registered
ExecuteHandler(action: any);
}
export class InstrumentationHandler {
//Array of actors available to middleware.
_actors: Array<BaseActor>;
constructor(instrumentationActors : Array<BaseActor>)
// Middleware function to register against a store
Middleware();
//Passes action to each actor.
public Handle(action:any)
}
}
- InstrumentationHandler.ts
import { BaseActor } from './BaseActor';
export class InstrumentationHandler {
//Array of actors available to middleware.
_actors: Array<BaseActor> = new Array<BaseActor>();
constructor(instrumentationActors : Array<BaseActor>) {
if (instrumentationActors != null) {
instrumentationActors.forEach(actor => this._actors.push(actor));
}
}
// Middleware function to register against a store
Middleware = store => next => action => {
this.Handle(action);
return next(action);
}
//Passes action to each actor.
Handle = (action:any) => {
this._actors.forEach(actor => actor.ExecuteHandler(action));
}
}
- BaseActor.ts
import { ActionHandler } from "./ActionHandler"
export abstract class BaseActor {
//Map of action to all handlers for an action
actionHandlers: Map<string, Array<ActionHandler>>;
actorName: string;
constructor(actorName: string) {
this.actorName = actorName;
this.actionHandlers = new Map<string, Array<ActionHandler>>();
this.AddActions.bind(this);
this.ExecuteHandler.bind(this);
}
//Registers all handlers against the actions provided by the actor
public AddActions(actionName: string, actions : Array<string>, customHandler: ActionHandler = null) {
}
//Executes all the handlers for action in the sequence they are registered
public ExecuteHandler(action: any) {
}
}
-- ActionHandler.ts
export interface ActionHandler {
(action: any): void;
}