2016-08-18 2 views
1

제 문제는 제 3 자 라이브러리에 TypeScript 형식 정의 .d.ts을 추가 할 때 발생합니다. 이 라이브러리를 제어하지 않는다는 것을 명심하십시오, 단순히 그것을 소비하고 tsc 컴파일러를 진정 시키려고합니다. 여기에 가이드 라인을 읽기Typescript 형식 정의를 찾는 중입니다. 새로운 + 호출 가능 설명

다시 : 쓰기 d.ts 파일 :

https://typescript.codeplex.com/wikipage?title=Writing%20Definition%20%28.d.ts%29%20Files

나는이 특정한 예제를 찾고 있어요 : 새로운 + 호출 방법 다음

를 문서는 다음과 같은 패턴을 보여줍니다

interface Widget { 
    sprock(): void; 
} 

interface WidgetFactory { 
    new(name: string): Widget; 
    (width: number, height: number): Widget; 
} 

declare var widget: WidgetFactory; 

나는 내 요구에 대해 다음 만들었습니다

declare module "react-localization" { 
    interface LocalizedStringsMethods { 
     setLanguage(language: string): void; 
     getLanguage(): string; 
     getInterfaceLanguage(): string; 
     formatString(str: string, ...values: any[]): string 
     getAvailableLanguages(): string[] 
    } 

    interface LocalizedStringsFactory { 
     new (props: any): LocalizedStringsMethods; 
    } 

    var LocalizedStrings: LocalizedStringsFactory; 

    export default LocalizedStrings; 
} 

여기서 주목할만한 예외는 문서 버전이 declare module을 사용하지 않는 것입니다. 그 외에도, 내 눈에는 이것들이 동일해야하며 비슷한 결과를 가져야한다. 나는 분명히 뭔가를 놓치고있다. 대신 다음과 같은 오류가 발생합니다 :

오류 TS2351 : 유형이 통화 또는 구성 서명이없는 표현식에 'new'를 사용할 수 없습니다.

declare module "react-localization" { 
    var LocalizedStrings: any; 
    export = LocalizedStrings; 
} 

오류는 이제 사라,하지만 나는 모든 훌륭한 유형 정보를 잃게 :

나는이 내 정의를 변경할 수 있습니다. .? = (

나는 딱하다는 정확히 무슨 잘못 여기서 뭐하는 거지 신비에 추가하려면 확인

, 나는 export default 대신 풀러 타입의 예에서 export =을하고 시도 :

declare module "react-localization" { 
    interface LocalizedStringsMethods { 
     setLanguage(language: string): void; 
     getLanguage(): string; 
     getInterfaceLanguage(): string; 
     formatString(str: string, ...values: any[]): string 
     getAvailableLanguages(): string[] 
    } 

    interface LocalizedStringsFactory { 
     new (props: any): LocalizedStringsMethods; 
    } 

    var LocalizedStrings: LocalizedStringsFactory; 

    export = LocalizedStrings; // <----- HERE instead of export default 
} 
?이 export defaultundefined를 반환 끝하지만 왜 작동

누군가가 나에게 설명 할 수 또한, 나는 가져올 수있는이 같은 :

import * as LocalizedStrings from 'react-localization' 내가로 가져 오기를 할 원합니다. 이 시점에서 전 (前者)과 함께 살 것이며, 나는 왜 그 이유를 알고 싶습니다.

+1

추가적으로이 타사 라이브러리가 babel에서 컴파일 된 것으로 보입니다. https://github.com/Microsoft/TypeScript/issues/5565'Babel이 내보내기 만 내보내기 인 모듈을 이동시킬 때 기본값은 모듈을 주입하는 것입니다.수출 = 수출 [기본 "]; 생성 된 코드에 내 보낸 객체를 함수 자체가되게합니다 (기본 속성으로 함수가있는 모듈 객체 대신). –

답변

0

해결 방법은 다음과 같습니다

react-localization.d.ts

declare module "react-localization" { 
    interface LocalizedStringsMethods { 
     setLanguage(language: string): void; 
     getLanguage(): string; 
     getInterfaceLanguage(): string; 
     formatString(str: string, ...values: any[]): string 
     getAvailableLanguages(): string[] 
    } 

    interface LocalizedStringsFactory { 
     new (props: any): LocalizedStringsMethods; 
    } 

    var LocalizedStrings: LocalizedStringsFactory; 

    export default LocalizedStrings; 
} 

yourFile.ts

import LocalizedStrings from 'react-localization'; 

var x = new LocalizedStrings(123); 

당신이 export = 다음 import = require() 사용해야 사용합니다. https://www.typescriptlang.org/docs/handbook/modules.html

+1

뉘앙스가 있습니다. 이 lib는 '반응 지역화'가 바벨에서 추출 되었기 때문에 http://github.com/Microsoft/TypeScript/issues/5565에있는 Anders 설명에 따라 babel은 이렇게합니다 :'module.exports = exports [ "default"] ;'전체 모듈을이 함수로 설정합니다.이 함수는 Typescript에서 기본적으로 가져 오는 중에'function() {...} .default'를 실행하려고합니다. 실제로는'undefined '입니다. 따라서 '물건에서 가져 오기'가 필요합니다. 이 줄을 제거하면,'module.exports = exports [ "default"];'는 타이프 스크립트를 효과적으로 사용할 수있게 해준다 :'default : .default' aka :'가져 오기 'thing'에서' –

+0

@ adam-venturella 네, 이 문제가 생겼어. 불행히도 나는 실제 바벨 결과로 노는 상용구가 없다. 내 대답이 부적절하다면 미안 해요. –