anyの排除、unknownと絞り込みの優先
anyをunknownと絞り込みに置き換え、小さなガードとアサーション関数を追加し、ビルドを壊さずにstrictフラグを段階的に有効化します
「anyの排除、unknownと絞り込みの優先」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン1/2です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全2レッスンが含まれています。
導入
目標:anyの使用箇所をなくします。信頼できない値にはunknownを優先し、簡単なチェックで絞り込みます。小さなガードを追加し、strictフラグを段階的に有効にします。
- any → unknown
- typeof/in/instanceofによる絞り込み
- アサーション関数
any の落とし穴
anyは安全性を無効にします。値の形状の誤りや文字列同士の計算がコンパイル時に見逃され、後で失敗する可能性があります。
// any hides bugs
function avgBad(values: any): number {
// Compiles even if values is not an array of numbers
return values.reduce((a: number, b: number) => a + b, 0) / values.length
}
// Runtime crash examples:
// avgBad(123)
// avgBad(["1","2"]) // string addition!unknown と絞り込み
外部から受け取る入力にはunknownを使用します。Array.isArrayとtypeofで型を絞り込んでから、安全に計算します。
// unknown forces checks
function avg(values: unknown): number {
if (!Array.isArray(values)) throw new Error("values must be an array")
const nums = values.filter((v): v is number => typeof v === "number")
if (nums.length === 0) throw new Error("no numbers")
const sum = nums.reduce((a, b) => a + b, 0)
return sum / nums.length
}
// avg([1,2,3]) → 2; avg("oops") throws early with a clear message型ガード
predicate x is Tを作成すると、呼び出し側で型をきれいに絞り込めます。ガードは小さく保ち、構造のチェックに集中させます。
// Small predicate to reuse narrowing
export type User = { id: string; name: string }
export function isUser(x: unknown): x is User {
return typeof x === "object" && x !== null
&& typeof (x as any).id === "string"
&& typeof (x as any).name === "string"
}
export function hello(x: unknown) {
if (!isUser(x)) throw new Error("invalid user")
return `Hello, ${x.name}`
}アサーション関数
アサーション関数(asserts x is T)は、実行後に型を絞り込みます。必須の事前条件に使用し、明確なメッセージを付けて例外をスローします。
// Assertion function throws or narrows
function assertUser(x: unknown): asserts x is { id: string; name: string } {
if (typeof x !== "object" || x === null) throw new Error("not an object")
const o = x as Record<string, unknown>
if (typeof o.id !== "string" || typeof o.name !== "string") throw new Error("bad user")
}
export function greetUnsafe(x: unknown) {
assertUser(x) // now x is narrowed after this call
return `Hi ${x.name}`
}厳格化の計画
計画:
noImplicitAnyを有効にし、まず新しく発生したエラーを修正します。- 外部入力用のガードを導入します。
strictNullChecksを有効にし、undefinedを明示的に処理します。- 残っている
anyをESLintで追跡し、時間をかけて減らします。
unknown と any の比較チェック
クイックチェック:信頼できないデータには、なぜanyよりunknownを優先するのですか?
まとめ
まとめ:anyをunknownに置き換え、小さなガードまたはアサーションを追加し、strictフラグを段階的に強化してビルドを正常に保ちます。
よくある質問
「anyの排除、unknownと絞り込みの優先」レッスンは無料ですか?
はい。「anyの排除、unknownと絞り込みの優先」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全2レッスンが含まれています。
「anyの排除、unknownと絞り込みの優先」で何を学びますか?
anyをunknownと絞り込みに置き換え、小さなガードとアサーション関数を追加し、ビルドを壊さずにstrictフラグを段階的に有効化します ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
TypeScript Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/2です。
「anyの排除、unknownと絞り込みの優先」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このTypeScript Academyレッスンでコードを書いて実行できますか?
はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- anyの排除、unknownと絞り込みの優先
- strictフラグを段階的に適用する