コンテンツにスキップ

[TypeScript] FAQ

targetやmodule系の設定違いが分からない

設定名 意味 個人的推奨
target コンパイル後のjsコードをどの仕様にするか es2015. レガシー環境ならes5
module moduleの読みこみをどのように表現するか nodejsならcommon. それ以外ならデフォルト1
moduleResolution module解決方法の指定 デフォルト2
esModuleInterop import * as A from 'a'* as を省略可能 true

tsconfig.jsonが読み込まれない

tscコマンドでファイルを指定した場合、古いバージョンのtscではtsconfig.jsonが暗黙的に読み込まれない。

どうしても指定したい場合の方法は分からず..

jsonファイルをインポートしたい

tsconfig.jsoncompilerOptionsに以下を記載する。

  "resolveJsonModule": true,`

こんな感じ。

import * as pkg from '~/package.json';

tscのエントリポイントを指定したい

tsconfig.jsonのfilesかincludeを指定する。
glob表現が不要ならfilesで十分。

{
    "files": [ "src/index.ts" ]
}

CLIで指定しない理由

CLIで指定するとtsconfig.jsonが無視されるため。

エラー系

TS2307: Cannot find module 'lodash'.

グローバルの古いtscを使っているケース

間違ってグローバルの古いtscを使っている場合はプロジェクトのtscを使うこと。(npm or npx)

定義ファイルを読み込んでいないケース

$ npm i -D @types/lodash

lib.dom.d.ts(19627, 15): 'name' was also declared here.

lib.dom.d.tsで宣言されたnameが再宣言されている。
main.tsなどのTopレベルでグローバルに定義すると発生する。

const name = "hoge"

main関数などでスコープを分けてやるとよい。

function main() {
    const name = "hoge"
}

main()

  1. targetがES2015より前ならCommonJS、そうでないならES6 

  2. targetがAMD or System or ES6ならClassic、そうでないならNode