Можно ли импортировать общий класс вне папки в TypeScript?

Я изо всех сил пытаюсь понять, как операторы импорта разрешают пути, и не могу определить, почему это не удается. У меня есть компонент Angular, который импортирует класс в другую папку. Это выглядит так:

введите описание изображения здесь

Мой компонент ссылается на этот общий класс следующим образом:

import { Component } from '@angular/core';
import { State } from '../common/models/state';

@Component({
    selector: 'apartment'
})
export class ApartmentComponent {
    states: State[];
}

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

Apartments:260 Error: Error: XHR error (404 Not Found) loading http://localhost/DemoApp/scripts/components/common/models/state
        at XMLHttpRequest.wrapFn [as _onreadystatechange] (http://localhost/DemoApp/node_modules/zone.js/dist/zone.js:647:29)
        at ZoneDelegate.invokeTask (http://localhost/DemoApp/node_modules/zone.js/dist/zone.js:236:37)
        at Zone.runTask (http://localhost/DemoApp/node_modules/zone.js/dist/zone.js:136:47)
        at XMLHttpRequest.ZoneTask.invoke (http://localhost/DemoApp/node_modules/zone.js/dist/zone.js:304:33)
Error loading http://localhost/DemoApp/scripts/components/common/models/state as "../common/models/state" from http://localhost/DemoApp/scripts/components/apartment/apartment.component.js

Возможна ли загрузка из внешнего каталога по относительному пути? Я поэкспериментировал с systemjs.config.js, чтобы дойти до этого момента, но мне кажется, что я должен что-то упустить, потому что этот импорт не работает. не работает.

Обратите внимание, что у меня есть tsconfig.json с такими настройками:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "noEmitOnError": false
  },
  "exclude": [
    "node_modules",
    "node_modules_dep",
    "wwwroot"
  ],
  "compileOnSave": true
}

и system.config.js добавляет дополнительные пакеты следующими способами:

/**
* System configuration for Angular 2 samples
* Adjust as necessary for your application needs.
*/
(function(global, window) {
    // map tells the System loader where to look for things
    var map = {
        'rxjs': 'npm:rxjs/'
    };

    // packages tells the System loader how to load when no filename and/or no extension
    var packages = {
        'app': { main: 'main.js', defaultExtension: 'js' },
        'rxjs': { defaultExtension: 'js' },
        'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' }
    };

    var ngPackageNames = [
        'common',
        'compiler',
        'core',
        'http',
        'platform-browser',
        'platform-browser-dynamic',
        'router',
        'forms'
    ];

    // Individual files (~300 requests):
    function packIndex(pkgName) {
        packages['@angular/' + pkgName] = {
            main: 'index.js',
            defaultExtension: 'js'
        };
    }

    // Bundled (~40 requests):
    function packUmd(pkgName) {
        packages['@angular/' + pkgName] = {
            main: 'bundles/' + pkgName + '.umd.js',
            defaultExtension: 'js'
        };

        map['@angular/' + pkgName] = 'npm:@angular/' + pkgName + '/';
    }

    // Most environments should use UMD; some (Karma) need the individual index files
    var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;

    // Add package entries for angular packages
    ngPackageNames.forEach(setPackageConfig);

    //Adding Additional Packages
    $.each(commonPackageNames, function (index, pkgName) {
        console.log("Loading (" + pkgName.name + ") from '" + pkgName.path + "'");
        var sName = pkgName.name;

        packages[sName] = {
            main: pkgName.main,
            defaultExtension: pkgName.defaultExtension
        }

        map[sName] = pkgName.path;
    });

    var config = {
        paths: {
            // paths serve as alias
            'npm:': window.baseURL + '/node_modules/'
        },
        map: map,
        packages: packages
    };

    System.config(config);
})(this, window);

Мы разделяем модули на страницу, поэтому они настраиваются через apartment.config.js, который выглядит так:

(map = map || {}).app = 'apartmentmodule';

commonPackageNames.push({
    name: 'apartmentmodule',
    main: 'main.js',
    defaultExtension: 'js',
    path: window.baseURL + 'scripts/components/apartmentmodule'
}); 

person Matthew Rhoden    schedule 21.10.2016    source источник
comment
Определенно можно перемещаться по структуре вашего приложения и извлекать данные из других папок. app ../component1 ../component2/subfolder/ Если бы вы были в подпапке, вы бы сделали ../../component1/component1; Я также хотел бы убедиться, что ваш <base href=></base> установлен правильно, поскольку он определяет начальную точку для ваших путей.   -  person silentsod    schedule 21.10.2016
comment
Попробуйте использовать второй ответ: stackoverflow.com/ вопросы/37547364/ и stackoverflow.com/questions/38538205/   -  person user2153990    schedule 03.12.2016


Ответы (2)


Вы уверены, что экспортировали свой State класс в state.ts? Как это:

export class State {

}

Ваш импорт кажется в порядке, это первая ошибка, о которой я подумал. Другое дело, что вы не скомпилировали некоторые из ваших файлов, в том числе с state.ts по .js. Проверьте, есть ли соответствующие файлы state.js и state.js.map в папке ~/common/models.

person Stefan Svrkota    schedule 21.10.2016
comment
Я дважды проверил, он генерирует файлы *.js и *.map.js. Также государство правильно экспортирует. - person Matthew Rhoden; 24.10.2016
comment
Я заметил, что путь, на который он жалуется, правильный, если я добавляю к нему тип файла. Любые идеи о том, почему он может не указывать .js при загрузке? - person Matthew Rhoden; 24.10.2016
comment
@MatthewRhoden Я действительно не очень, извините, я хотел бы помочь больше. Я удалю свой ответ, когда вы увидите это, надеюсь, что кто-то с большим опытом поможет вам. - person Stefan Svrkota; 24.10.2016

используйте import {State} из '../../common/models/state';

person Syed Fazil    schedule 05.08.2020