문제 상황

tsconfig.json에서 설정한 typeRoots설정이 tsc에서는 올바르게 동작하지만, ts-node에서는 타입을 참조하는데 문제가 있는 경우입니다.

해결 방법

--files 옵션 이용하기

첫번째 방법은 --files 옵션을 이용하는 것입니다.ts-node --files src/server.ts와 같이 --files 옵션을 사용하면 ts-node에서도 정상적으로 typeRoots에서 타입이 정의된 파일들을 불러와 실행시킬수 있습니다. 아래는 package.json에서 script에 적용한 예시입니다.

package.json
1
2
3
4
5
6
7
{
"script": {
"start:dev": "nodemon --exec ts-node --files src/server.ts",
...
}
...
}

추가적으로, ts-nodefiles, include, exclude를 기본적으로 이용하지 않도록 설정되어있습니다. 따라서 앞서 말한 옵션들 또한 이용하려면 --files플래그를 이용하거나 TS_NODE_FILES=true로 설정해야합니다. 자세한 정보는 ts-node의 깃허브 README를 참고해주세요.

Triple-Slash Directives

1
2
/// <reference path="./types/user.d.ts" />
import * as express from "express";

두번째 방법은 typeRoots를 사용하지 않고 /// <reference path="./types/user.d.ts" />와 같이 Triple-Slash Directives를 이용하는 방법입니다.Triple-Slash Directives는 반드시 소스파일 최상단에 위치해야합니다.

결론

저는 ts-node를 개발환경에서만 이용하기 때문에 개발환경에서는 첫번째 방법인 --files를 이용하고 프로덕션 환경에서는 빌드한후 배포합니다.