strict モードが実際に何を有効にするのかを理解し、既存プロジェクトでそれが明らかにする典型的なエラーへの対処方法を知ります。
このレッスンを Kodokon で開く"strict": true はひとつのオプションではなく、一群のチェックを有効にする 集合体 です。strictNullChecks、noImplicitAny、strictFunctionTypes、strictBindCallApply、strictPropertyInitialization、noImplicitThis、useUnknownInCatchVariables、alwaysStrict が含まれます。TypeScript の新しいバージョンごとにさらに追加される可能性があります。strict を有効にすることは、将来のチェックを購読することです。各フラグは個別に無効化することもでき、既存のコードベースでの段階的な移行を可能にします。
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"noFallthroughCasesInSwitch": true,
"exactOptionalPropertyTypes": true,
"verbatimModuleSyntax": true,
"skipLibCheck": true
}
}最も影響の大きい 2 つのフラグは strictNullChecks と noImplicitAny です。前者はすべての型から null と undefined を取り除きます。潜在的に存在しない値はすべて T | undefined と宣言し、使用前に処理しなければなりません。後者は、注釈のない引数が any にフォールバックすることを拒否します。この 2 つが揃うと、JavaScript の大きなバグ 2 系統を排除できます。「cannot read property of undefined」と、チェックされない値の伝播です。useUnknownInCatchVariables が絵を完成させます。JavaScript は何でも throw できるため、catch の変数は unknown になります。
function findPort(
env: Record<string, string | undefined>
): number {
const raw = env["PORT"];
if (raw === undefined) {
return 3000;
}
return Number.parseInt(raw, 10);
}
declare function riskyOperation(): void;
try {
riskyOperation();
} catch (err) {
const message =
err instanceof Error ? err.message : String(err);
console.error(message);
}よくある移行時のエラーと、その本当の対処法です。「Object is possibly undefined」には、非 null アサーション !(クラッシュを別の場所に移すだけ)よりも、絞り込み(if)、オプショナルチェーン ?.、?? のデフォルトを優先しましょう。「Property has no initializer」(strictPropertyInitialization)には、フィールドに ! を付けるのではなく、コンストラクタで初期化しましょう。?? と || の落とし穴にも注意してください。port || 3000 は 0 や "" も置き換えますが、port ?? 3000 は null と undefined だけを置き換えます。
interface Settings { retries?: number }
function resolveRetries(s: Settings): number {
const bad = s.retries || 3;
const good = s.retries ?? 3;
return good;
}
const names = ["Ada", "Linus"];
const first = names[0];
const upper = first?.toUpperCase() ?? "N/A";集合体の外にも、チームでの議論に値する 3 つのオプションがあります。noUncheckedIndexedAccess はすべてのインデックスアクセス(arr[i]、dict[key])に undefined を追加します。より安全ですが、配列操作のコードでは冗長になります。多くのチームは新規プロジェクトでのみ採用します。exactOptionalPropertyTypes は「プロパティが不在」と「プロパティが undefined に設定」を区別し、パッチにとって重要です。skipLibCheck は依存関係の .d.ts ファイルのチェックをスキップします。ビルド時間と、ライブラリ間の衝突検出との間の意図的なトレードオフです。
"strict": true は正確には何をしますか?retries?: number を 0 に設定した場合、retries || 3 と retries ?? 3 の違いは何ですか?// @ts-ignore よりも // @ts-expect-error を優先するのはなぜですか?