Написание модуля для демонстрации всех классов и интерфейса новой функции - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь создать инструментарий для нашего проекта. Он состоит из обработчика, который содержит список актеров. Когда любое действие отправляется в реакции, все участники, зарегистрированные в промежуточном программном обеспечении инструментария, передают это действие для выполнения.

Я хочу разбить все классы этой реализации в модуле и ссылаться на него таким образом, чтобы не требовалось индивидуально импортировать классы / интерфейс.

Проблема в том, что когда я объявляю локальный модуль и пытаюсь импортировать его как модуль, ошибки компиляции не возникает. Если я использую какой-либо интерфейс, определенный в модуле, я могу реализовать его, однако, если я пытаюсь расширить любой класс, определенный в модуле, выдает ошибку «Модуль не найден»

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;
}
...