2017-11-21 1 views
1

나는 DefinitelyTyped에 대한 몇 가지 선언 파일을 읽어 봤는데 종종이 같은 파일을 가로 질러 온 : `네임 스페이스로 내보내기 '는 TypeScript .d.ts 파일에서 무엇을 의미합니까?

declare function domready(callback:() => any) : void; 

export = domready; 
export as namespace domready; 

나는 처음 두 행 이해 - 모듈 객체로 작동 기능 및 수출을 선언합니다. 그러나 마지막 줄은 무엇입니까? 선언문에 이걸 필요합니까? 그것은 무엇을합니까?

답변

2

이것은 UMD module declaration입니다.

아직 익숙하지 않은 경우, UMD는 같은 자바 스크립트 라이브러리가 전역 변수 (어디서나 액세스 할 수있는 하나)으로 사용하거나 할 수있는 생성 패턴입니다 모듈 (하나 런타임에 특별히로드 됨).

많은 라이브러리가 UMD 패턴으로 기록됩니다. 예를 들어, 브라우저에서

moment.parse("12-31-2017") 

을 쓸 수 있습니다,하지만 Node.js를이 같은 코드를 작성 : 당신이 export function parse 같은 export 선언을 쓸 때

const m = require("moment"); 
m.parse("12-31-2017") 

가, 타이프 라이터 당신이를 설명하고 알고 모듈은 두 번째 코드 블록과 같습니다.

export as namespace the_global_identifier; 

일부 UMD 라이브러리 항상이 생성됩니다 : 라이브러리는 또한 전역 변수를 생성하기위한 .d.ts 파일을 작성하는 경우에, 당신은 UMD 모듈 선언 구문을 사용하여 해당 전역 변수를 설명 할 수 있습니다 반면에 은 모듈 시스템이있는 환경에서로드되는 경우을 가져와야합니다. 일반적으로 라이브러리는 사용하는 동작을 명확하게 문서화하지 않습니다. 즉, 선언 파일 작성자는 예상되는 문자를 실제로 알지 못합니다. 즉, TypeScript는 보수적이며 만 참조하는 파일이 이 아닌 경우 전역 식별자에 대한 액세스를 허용합니다. 모듈.

당신이 선언 파일을 작성하고 다음과 같이 패턴을 확인, 그들은 라이브러리 UMD인지 아닌지 확실하지 않은 경우 :

(function (global, factory) { 
    typeof exports === 'object' && typeof module !== 'undefined' ?  factory(exports) : 
    typeof define === 'function' && define.amd ? define(['exports'], factory) : 
    (factory((global.mymodule = global.mymodule || {}))); 
}(this, function (exports) { 'use strict'; 
    function myFunction() { 
     console.log('hello world'); 
    } 
})); 

이 고자질 UMD 냄새입니다 : 많은 typeof은 "exports", "module"및 "define"을 검사 한 다음 큰 함수 본문에 지정된 "exports"매개 변수에 할당합니다. 라이브러리 코드에서 이것을 보지 않는다면 거의 UMD 모듈이 아니며 이 아닌export as namespace 선언을 작성해야합니다.

관련 문제