概要
https://www.typescriptlang.org/tsconfig#lib
"lib": ["DOM", "ES2019"]
コンパイルする際に使用する組み込みライブラリを指定します。
このオプションで指定したライブラリの型が読み込まれるため、逆に言うとここで指定していない組み込みライブラリは型エラーになります。
基本的にはtarget
で指定している JS の仕様に含まれているものは暗黙的に指定されます。
ただし、明示的に指定した場合、暗黙的に指定されていたものは全て除外されるため注意。
このオプションの利用タイミングとしては、ある仕様を Polyfill で利用可能にしているが、全体はそれが含まれる仕様よりも前のバージョンの JS にコンパイルしたい場合など。
指定できる値は非常に多いので、公式のドキュメントを参照してください。
(公式のドキュメントにも、「更新しきれない可能性があるから実際の TypeScript のコード見てね」って書いてあります)
詳細
例えば、tsconfig.json
でtargetを指定しない場合、デフォルトではES3
になるため、ES3 に含まれていない組み込みライブラリはエラーになります。
$ npx tsc -v
4.0.3
const func = async () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve("5秒経ちました");
}, 5000);
});
};
src/hoge.ts:2:14 - error TS2585: 'Promise' only refers to a type, but is being used as a value here. Do you need to change your target library? Try changing the `lib` compiler option to es2015 or later.
2 return new Promise((resolve) => {
~~~~~~~
(async
は組み込みライブラリではなく記法なのでこの場合は関係なし)
こういう場合は、lib
に
"lib": ["DOM", "ES2015"]
と指定することでエラーを回避できます。
前述の通り、明示的に指定すると暗黙的に指定されていたものが指定されなくなるので、必要なものは全て列挙する必要があります。
この例ではsetTimeout
を使っていて、こういったブラウザで提供されるライブラリを使用するにはDOM
を指定する必要があります。
(つまりlib
を指定していない場合はDOM
も暗黙的に指定されている)
関連オプション:target