Системные модули TypeScript не регистрируют расположение импортированных файлов

Проблема

Я использую TypeScript v. 1.6.2 для компиляции исходников ts в js с использованием модулей ES5 и system. Я ожидаю, что JS будет иметь system.register, заполненный массивом строк, которые представляют импортированные исходные местоположения. Например:

System.register(['angular2/angular2', 'angular2/router', 'angular2/http'], 
    function(exports_1) { ...

Однако в моем случае system.register пусто. Я не уверен, почему он пуст, но я явно не могу обойтись без импорта. Ниже приведен набросок моей файловой структуры, пример исходного кода и файл tsconfig.json.

Структура файла

  |index.js
  |
  |components
     |
     |--Bike
        |
        -Bike.ts

Источник

/// <reference path="components/Bike/Bike.ts" />

import { Bike } from 'components/Bike/Bike';

export class TestClass {
    
    public bike: Bike;
    
    constructor(bike: Bike) {
        
        this.bike = bike;

        console.log('Bike new TestClass');
        
    }
        
}

...

export class Bike {

    constructor() {
    
        console.log('new bike');
        
    }

}

Вывод

/// <reference path="components/Bike/Bike.ts" />

  //NOTICE - no locations in the registry!

System.register([], function(exports_1) {
    var TestClass;
    return {
        setters:[],
        execute: function() {
            TestClass = (function () {
                function TestClass(bike) {
                    this.bike = bike;
                    console.log('Bike new TestClass');
                }
                return TestClass;
            })();
            exports_1("TestClass", TestClass);
        }
    }
});

tsconfig.json

{
    "compilerOptions": {
        "target": "es5",
        "module": "system",
        "declaration": true,
        "removeComments": false,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "listFiles": true,
        "outDir": "target/js"
    },
    "exclude": [
        "node_modules",
        "jspm_packages",
        "bower_components",
        "d3",
        "plottable",
        "angular2",
        "target"
    ]
}

person Jefftopia    schedule 25.11.2015    source источник


Ответы (2)


У меня такая же проблема. Проблема в том, что вы используете тип Bike только для объявления. Вы ничего не вызываете в классе Bike (например, статическую функцию) или передаете Bike в качестве параметра или тому подобное. Поэтому нет необходимости импортировать Bike в скомпилированный файл javascript (по крайней мере, с точки зрения компиляторов или команды typescript, создавшей компилятор)

Но я нашел решение для этого: параметр компилятора emitDecoratorMetadata:true гарантирует, что также будет импортирован Bike. Здесь описание из https://github.com/Microsoft/TypeScript/wiki/Compiler-Options :

Выдавать метаданные типа дизайна для оформленных объявлений в исходном коде. См. подробности в issue #2577.

Надеюсь, это поможет.

person charlieMACK    schedule 20.03.2016
comment
Это достойный диагноз, за ​​исключением того, что мой tsconfig действительно устанавливает emitDecoratorMetadata: true. Когда я писал это, происходило что-то странное. В настоящее время у меня нет этой проблемы. Ответ принят, потому что это, вероятно, проблема, которую ищет большинство тех, кто заходит на эту страницу. - person Jefftopia; 20.03.2016

в моем случае system.register пуст. Я не уверен, почему он пуст,

Вы получаете только то, что import.

Например. чтобы получить angular2/angular2 в качестве зависимости, вам нужно что-то вроде:

import * as angular2 from "angular2/angular2";
person basarat    schedule 25.11.2015
comment
В моем примере я импортирую модуль Bike. Конечно, это должно привести к тому, что мой реестр будет иметь ['components/Bike/Bike'] правильно? - person Jefftopia; 26.11.2015