2016-09-30 100 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" 
] 
} 

有我S ON https://github.com/iwhp/issues/tree/master/typescript-bug-declaration-file-with-angular

预期的行为GitHub库:

一个.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编译它,你可以用更现代的

import * as angular from 'angular'; 

然后替换该行

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

。 d.ts文件已创建,但由于您未导出MyModule而为空,因此您需要一个export太:

export module MyModule { 

UPDATE

现在,如果你想模块MyModule分割成几个文件,我找不到任何方式参考角度类型定义,同时保持模块MyModule内部。这个有关angular私密的错误信息看起来像一个错误 - 在angular.d.ts标识angular被多次声明,其中一些声明是export,所以我不知道为什么它被认为是私有的。

如果你想走模块化的路线,那么你可以使用这个answer中描述的解决方法 - 你需要在他们的源文件中有最高层的MyClass和MyClassB,并且有独立的MyModule文件将它们导出。

的缺点是:

  • 你不能编译到单个文件而无需更换模块类型amdsystem,所以你必须添加"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