핵심은 컴파일 된 js 결과물에 다음과 같은 코드가 포함되어야 한다는 것이다.
// index.js
module.exports = foo
이를 위해선 소스 ts 파일에서 다음과 같은 문법을 사용한다.
// index.ts
export = foo
export = foo
문법을 사용하면 더 이상의 export 가 불가능하다. 다른 것들을 함께 export 하려면, foo
의 프로퍼티로 추가하는 방법을 생각해볼 수 있다.
function foo(): number {return 1}
function bar(): string {return 'c'}
type TLib = {
(): number
bar: () => string
}
const lib = <TLib>foo
lib.bar = bar
export = foo
다음 환경에서 ts로 라이브러리를 만들면 IDE에서 라이브러리의 정의로 이동했을 때, 소스 파일이 아닌 d.ts 선언 파일로 이동하게 된다.
src
라는 디렉터리에 index.ts
파일을 포함한 모든 ts 파일이 있음build
라는 디렉터리에 tsc 컴파일 결과물이 있으며, package.json
에서 build/src/index.js
파일을 main
필드로 지정, build/src/index.d.ts
파일을 types
필드로 지정.npmignore
파일을 설정하여 npm publish
할 때 컴파일한 결과물은 포함하되 ts 소스 파일은 제외한다. ts 소스 파일을 제외하지 않으면, 정의로 이동시 ts 소스 파일로 이동할 수 있다.
기타 이유로 라이브러리에 ts 소스 파일을 노출하고 싶지 않으면, 위의 방법을 이용할 수 있을 것 같다.