2016-06-25 12 views
0

I имеет следующую структуру папок:Failed разрешения импорта с использованием относительного пути

enter image description here

Мою попытка импортировать языковую EVENT-подписчик в language.component.ts такого

import {LanguageEventSubscriber} from './language-event-subscriber' 

Однако, хотя класс, по-видимому, разрешен в среде IDE, класс не найден во время выполнения в качестве доказательства, поскольку он не распечатывает свои записи журнала.

Однако следующие работы:

import './language-event-subscriber' 

Однако в той же папке следующие Разрешает и работает во время выполнения

import {EventSubscriber, On} from "event-dispatch"; 
import {Language} from './language.model' 

@EventSubscriber() 
export class LanguageEventSubscriber { 
    @On('onValidLanguage') 
    onValidLanguage(language: Language) { 
     console.log(language); 
    } 

    @On('onInvalidLanguage') 
    onInvalidLanguage(status: string) { 
     console.log("New status: "); 
    } 
} 

Почему это несоответствие?

Благодаря

+0

Не могли бы вы поделиться тем, что находится в 'language-event-subscriber.ts'? Не видя этого, я подозреваю, что вы не экспортируете класс 'LanguageEventSubscriber' в этот файл. Впрочем, догадка. – filoxo

ответ

0

На основе документации от event-dispatch package, даже если у вас есть export class LanguageEventSubscriber в вашем определении, это на самом деле не класс, который предназначен для импорта и потребляются точно так же, как и другие модули. Если вы должны были сделать это более распространенный способ, код, который использует ваш модуль будет выглядеть примерно так:

// This is NOT the way to use this package 
import {LanguageEventSubscriber} from './language-event-subscriber'; 

let les = new LanguageEventSubscriber(); 
// ... respond to events using your variable ... 

Однако, это не так, как это означает, этот пакет будет использоваться. Из-за @EventSubscriber() декоратора в определении вашего класса, ваши обработчики событий становятся доступными для объектов типа EventDispatcher и используются как это:

import {EventDispatcher} from "event-dispatch"; 
import "./language-event-subscriber"; 

let ed = new EventDispatcher(); 
ed.dispatch("onInvalidLanguage", "Sorry. That language is unavailable."); 
// ... etc. ... 

на основе the Typescript documentation, я бы предположил, что причина, вы должны импортировать модуль в таким образом, потому что он рассматривается как побочный эффект, описанный в разделе «Импортировать модуль только для побочных эффектов».

Я не думаю, что это обязательно противоречиво, но вполне возможно, что пакет event-dispatch был закодирован нестандартным образом. Похоже, что это относительно новый пакет с небольшим количеством загрузок, так что это чистая спекуляция, но просто может быть, что разработчики пакета не знали или предпочитали не следовать стандартной идиоме для TypScript.

Смежные вопросы