diff --git a/.changeset/huge-files-smile.md b/.changeset/huge-files-smile.md new file mode 100644 index 00000000..b5689551 --- /dev/null +++ b/.changeset/huge-files-smile.md @@ -0,0 +1,5 @@ +--- +"@virtual-live-lab/tsconfig": major +--- + +feat!: enable exactOptionalPropertyTypes diff --git a/.changeset/proud-months-repeat.md b/.changeset/proud-months-repeat.md new file mode 100644 index 00000000..618b1c74 --- /dev/null +++ b/.changeset/proud-months-repeat.md @@ -0,0 +1,7 @@ +--- +"@virtual-live-lab/tsconfig": major +--- + +feat!: enable noUncheckedSideEffectImports + +BREAKING CHANGE: Now all presets require TypeScript 5.6 or later. diff --git a/.changeset/twelve-rice-repeat.md b/.changeset/twelve-rice-repeat.md new file mode 100644 index 00000000..fad3a394 --- /dev/null +++ b/.changeset/twelve-rice-repeat.md @@ -0,0 +1,5 @@ +--- +"@virtual-live-lab/tsconfig": major +--- + +feat!: enable verbatimModuleSyntax diff --git a/packages/tsconfig/base.json b/packages/tsconfig/base.json index bdd0c4f8..b389e6aa 100644 --- a/packages/tsconfig/base.json +++ b/packages/tsconfig/base.json @@ -8,6 +8,8 @@ "noImplicitReturns": true, "noPropertyAccessFromIndexSignature": true, "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + "noUncheckedSideEffectImports": true, "strict": true, "strictNullChecks": true, // modules @@ -18,6 +20,7 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "isolatedModules": true, + "verbatimModuleSyntax": true, // language-and-environment "target": "ES2022", "lib": ["ES2023"], diff --git a/packages/tsconfig/docs/base/compiler-options.md b/packages/tsconfig/docs/base/compiler-options.md index f12112db..85e0edfe 100644 --- a/packages/tsconfig/docs/base/compiler-options.md +++ b/packages/tsconfig/docs/base/compiler-options.md @@ -46,13 +46,15 @@ ### [Exact Optional Property Types](https://www.typescriptlang.org/ja/tsconfig/#exactOptionalPropertyTypes) -設定値: `false (default)` +設定値: `true` オプショナルなプロパティの型を厳密にチェックするかどうかを設定する。例についてはドキュメントを見たほうが早い。 `?`をつけたプロパティであっても、明示的に許可しない限り`undefined`を渡せなくなる。 この点に関しては非常に良いルールであると考える。実際TypeScript公式も有効化を推奨している。 -**ただし、実際に有効にすると様々な関数、特に外部ライブラリの関数に`option`のような設定オブジェクトを渡す場合にエラーが発生する。これらにすべてts-expect-errorをつけるまでして有効化すべきでないと判断したため、デフォルト値のままとする。** +~~ただし、実際に有効にすると様々な関数、特に外部ライブラリの関数に`option`のような設定オブジェクトを渡す場合にエラーが発生する。これらにすべてts-expect-errorをつけるまでして有効化すべきでないと判断したため、デフォルト値のままとする。~~ + +TypeScript 5.9 以降この設定は `tsc --init` で生成される推奨設定に含まれていており、このオプションを有効にして問題ないほどエコシステムが成熟したと考えられるため有効化した。 ### [No Fallthrough Cases In Switch](https://www.typescriptlang.org/ja/tsconfig/#noFallthroughCasesInSwitch) @@ -276,6 +278,9 @@ Module Suffixに指定したSuffixを考慮してモジュール解決を行う 安全性が向上するため、有効にしておく。 +補足: 一度 で有効化したが、 のような事情により無効化されていた。 +TS 5.9 以降この設定は `tsc --init` で生成される推奨設定に含まれていており、十分一般的な設定になっていると判断したため有効化する。 + ### [Paths](https://www.typescriptlang.org/ja/tsconfig/#paths) 設定値: not set @@ -605,15 +610,17 @@ CommonJSモジュールをimportする際に、NameSpaceオブジェクトを生 ### [Verbatim Module Syntax](https://www.typescriptlang.org/ja/tsconfig/#verbatimModuleSyntax) -設定値: `false (default)` +設定値: `true` import文の処理が逐語的なトランスパイルになる。 このため、`import type {}`文は丸ごと削除され、`import {a, type B}`のような文は`import {a}`に変換される。 -しかし、このオプションを有効にするとCommon JS向けにトランスパイルする際にもimport文がrequire文に変換されないため非常に面倒になる。 +~~しかし、このオプションを有効にするとCommon JS向けにトランスパイルする際にもimport文がrequire文に変換されないため非常に面倒になる。~~ + +~~これと同等のチェックをESLintのプリセットで行うように設定しているため、TypeScript側ではデフォルト値のままとする。~~ -これと同等のチェックをESLintのプリセットで行うように設定しているため、TypeScript側ではデフォルト値のままとする。 +この設定は TS 5.9 以降、`tsc --init` で生成される推奨設定に含まれていており、CJS 向けのトランスパイルも基本行わない情勢になっているので有効化する。 ## Backwards Compatibility diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index a0eeee30..aa368764 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -7,7 +7,7 @@ "*.json" ], "peerDependencies": { - "typescript": "^5.0.0" + "typescript": "^5.6.0" }, "devDependencies": { "typescript": "catalog:"