2016-09-23 187 views
1

我們有一個TypeScript庫,我們將發佈到私有NPM環境,並且我們希望在其他TS,ES6或ES5項目中使用該庫。TypeScript默認常量導出

讓庫是NPM包命名爲foo,其主要文件的工作每桶執行以下操作:

// Index.ts 
import Foo from './Core/Foo'; 

export {default as Foo} from './Core/Foo'; 

const foo = new Foo(); 

export default foo; 

我們要導出主庫類以及爲應用程序使用的默認實例除非必要,否則不會創建新的。

此外,我們創建了一個獨立的存儲設備的類型定義文件以類似的方式來DefinitelyTyped:

// foo.d.ts 
declare namespace Foo { 
    export class Foo { 
    public constructor() 
    // ...methods 
    } 

    const foo: Foo; 

    export default foo; 
} 

declare module 'foo' { 
    export = Foo; 
} 

運行測試的失敗並error TS1063: An export assignment cannot be used in a namespace.

我的目標是什麼的是有這樣的默認實例的用法:

// ES5, browser env 
window.Foo.foo.someMethod(); 

// ES6/TS 
import foo from 'foo'; 

foo.someMethod(); 

任何想法,如果有一個正確的方法來做到這一點?

編輯

聲明只是模塊@丹尼爾 - rosenwasser提示工作過,但有一個問題,當我們試圖創建一個擴展的第一個新的模塊。

例如:

// bar.d.ts 
/// <reference path="../foo/foo.d.ts"/> 

import { 
    Foo 
} from 'foo'; 

declare module 'bar' { 
    export class Bar extends Foo { 
    public constructor(); 
    // more methods 
    } 
} 

而且它的測試:

// bar-tests.ts 
/// <reference path="../foo/foo.d.ts"/> 
/// <reference path="./bar.d.ts"/> 

import foo, { 
    Foo 
} from 'foo'; 

import { 
    Bar 
} from 'bar'; 

namespace TestBar { 
    { 
    let result: Foo; 
    result = foo; 
    } 

    { 
    let result: Foo; 
    result = new Bar(); 
    } 
} 

的錯誤,這一次是:

bar/bar-tests.ts: error TS2307: Cannot find module 'bar'. 
bar/bar.d.ts: error TS2664: Invalid module name in augmentation, module 'bar' cannot be found. 

回答

3

錯誤此消息是錯誤的,所以我打開了一個爲您的問題:https://github.com/Microsoft/TypeScript/issues/11092

如果你有一個ES風格的模塊,你應該直接在環境模塊聲明定義它:

declare module "foo" { 
    export class Foo { 
     public constructor() 
     // ...methods 
    } 

    const foo: Foo; 

    export default foo; 
} 
+0

是的,其實這就是我以前有,但問題來了後,當我試圖創建一個擴展此模塊的新模塊將會將示例添加到問題中... – RecuencoJones

+2

在另一個模塊中,「declare module」foo「{}'語法創建*模塊擴充*。你在另一個模塊中的*原因*是你有一個頂級導入。您可以將導入*移動到「聲明模塊」欄中,以使其正常工作。 –

+0

這工作!我沒有意識到進口聲明應該放在模塊聲明中,謝謝Daniel! – RecuencoJones