2016-09-30 104 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