2016-09-30 2 views
0

При использовании опции компилятора TSC "declaration": true я получаю следующее сообщение об ошибке:Создание d.ts файла с опцией компилятор генерирует ошибку для углового

error TS4019: Implements clause of exported class 'MyClass' has or is using private name 'angular'.

Я не получаю сообщение об ошибке при использовании "declaration": false.

Использование машинопись Версия: 2.0.3

Пример Код:

MyClass.ts

/// <reference path="node_modules/@types/angular/index.d.ts" /> 
module MyModule { 
    export class MyClass implements angular.IServiceProvider { 
     constructor() { 
     } 
     $get; 
    } 
} 

tsconfig.json

{ 
    "compilerOptions": { 
    "noImplicitAny": false, 
    "noEmitOnError": true, 
    "removeComments": false, 
    "sourceMap": true, 
    "target": "es5", 
    "declaration": true 
}, 
"exclude": [ 
    "node_modules" 
] 
} 

Там я с к GitHub репо на https://github.com/iwhp/issues/tree/master/typescript-bug-declaration-file-with-angular

Ожидаемое поведение:

файл A .d.ts должен быть создан.

Дополнение к образцу выше

Я добавил следующий класс, чтобы показать, что MyClass.ts используется здесь.

MyClass2.ts

/// <reference path="node_modules/@types/angular/index.d.ts" /> 
module MyModule { 
    export class MyClassB implements angular.IServiceProvider { 
     constructor(myClass: MyModule.MyClass) { 
     } 
     $get; 
    } 
} 

ответ

1

Если вы всегда собираетесь скомпилировать его с машинописи 2.0, вы можете заменить эту линию

/// <reference path="node_modules/@types/angular/index.d.ts" /> 

с более современным

import * as angular from 'angular'; 

Тогда. Создается файл d.ts, но он пуст, потому что вы не экспортировали MyModule - для этого вам нужен export тоже:

export module MyModule { 

UPDATE

Теперь, если вы хотите разделить модуль MyModule на несколько файлов, я не мог найти способ ссылаться определения углового типа, сохраняя при этом модуль MyModule внутренний. Это сообщение об ошибке около angular, являющееся приватным, выглядит как ошибка - в angular.d.ts идентификатор angular объявлен несколько раз, а некоторые из этих объявлений с export, поэтому я понятия не имею, почему он считается приватным.

Если вы хотите перейти по пути к внешним модулям, вы можете использовать обходное решение, описанное в этом answer, - вам нужно иметь MyClass и MyClassB на верхнем уровне в исходных файлах и иметь отдельный файл MyModule, -экспортирует их оба.

Недостатками являются:

  • вы не можете собрать в один файл, не изменяя тип модуля для amd или system, так что вы должны добавить "module": "amd", "moduleResolution": "node" к tsconfig.json для этого компиляции (компиляции для разделения файлов не влияет)

  • MyClass и MyClassB по-прежнему экспортируется на высшем уровне, а также в MyModule модуле (вы можете переместить их в подкаталог, если вы хотите)

  • есть круговая ссылка между MyClassB и MyModule (на самом деле это не недостаток, разрешение узла узла должно обрабатывать его просто отлично, но выглядит очень странно).

Полные файлы:

MyClass.ts

import * as angular from 'angular'; 

export class MyClass implements angular.IServiceProvider { 
    constructor() { 
    } 

    $get; 
} 

MyClassB.ts

import * as angular from 'angular'; 
import * as MyModule from './MyModule'; 

export class MyClassB implements angular.IServiceProvider { 
    constructor(myClass: MyModule.MyClass) { 
    } 

    $get; 
} 

MyModule.ts

export {MyClass} from './MyClass'; 
export {MyClassB} from './MyClassB'; 
+0

Thankx artem. Это действительно работает, но теперь я добавил новый класс MyClassB, который использует MyClass. Теперь я получаю следующие сообщения при использовании вашего предложения: ошибка TS2305: модуль «MyModule» не имеет экспортированного члена MyClass. – iwhp

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