2016-09-23 3 views
1

우리는 개인 NPM 환경에 게시하는 TypeScript 라이브러리가 있으며이 라이브러리를 다른 TS, ES6 또는 ES5 프로젝트에서 사용하려고합니다.TypeScript 기본 상수 내보내기

라이브러리가 foo를라는 NPM 패키지하자가 주요 파일을 수행 배럴로 작동 다음

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

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

const foo = new Foo(); 

export default foo; 

우리는 중앙 도서관 클래스뿐만 아니라 애플 리케이션을 사용하기위한 기본 인스턴스를 내보낼 필요하지 않으면 새로운 것을 만들지 않아도됩니다.

또한, 우리는 DefinitelyTyped에 비슷한 방식으로 별도의 저장소의 유형 정의 파일을 생성 : 그것은이다에 대한 error TS1063: An export assignment cannot be used in a namespace.

내가 목표로하고있어 어떤 실패에 대한

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

    const foo: Foo; 

    export default foo; 
} 

declare module 'foo' { 
    export = Foo; 
} 

이 테스트를 실행 다음과 같은 기본 인스턴스를 사용하십시오.

// 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/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

오류 메시지가 잘못이다, 그래서 나는를 열어 :

// 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(); 
    } 
} 

오류이 시간은 문제 : 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"{} "구문은 * module augmentation *을 만든다. 다른 모듈에있는 * 이유 *는 최상위 가져 오기가 있다는 것입니다. import *를'declare module' "bar"'로 옮겨서 제대로 작동하게 할 수 있습니다. –

+0

이것이 효과가 있습니다! import 문이 모듈 선언 안에 있어야한다는 것을 알지 못했습니다. Daniel에게 감사드립니다! – RecuencoJones

관련 문제