0Pricing
TypeScript Academy · レッスン

Predicate関数とsatisfies演算子

Predicateの戻り値型を持つカスタム型ガードを記述し、satisfies演算子で型を拡大せずにオブジェクトを検証します

「Predicate関数とsatisfies演算子」はCoddyKit上の無料TypeScript Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはTypeScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 TypeScript Academyコースには全3レッスンが含まれています。

導入

目標:型を絞り込む述語関数(例:value is T)を作成し、型を拡大せずに形状をチェックするためにsatisfiesを使います。

  • カスタムガード = 再利用可能な実行時チェック
  • satisfies = リテラルを保持するコンパイル時の形状チェック

述語の基本

述語関数はx is Typeを返します。チェック後、そのスコープ内では変数の型が絞り込まれます。

function isNumber(x: unknown): x is number {
  return typeof x === "number"
}

function demo(a: unknown) {
  if (isNumber(a)) {
    // inside: a is number
    return a.toFixed(2)
  }
  return "not a number"
}

形状ガード

ガードはオブジェクトの形状をチェックします。チェックに通ればUserとして絞り込まれ、安全に使用できます。

type User = { id: number; name: string }

function isUser(v: unknown): v is User {
  return typeof v === "object" && v !== null &&
    "id" in v && "name" in v &&
    typeof (v as any).id === "number" &&
    typeof (v as any).name === "string"
}

function printUser(u: unknown) {
  if (isUser(u)) {
    console.log(u.name.toUpperCase())
  } else {
    console.log("invalid user")
  }
}

境界を越えた利用

ガードによって、関数の境界を越えて安全にデータを受け渡せます。外側ではunknown、内部では制御されたUserとして扱います。

function fetchAndPrint(json: string) {
  const value: unknown = JSON.parse(json)
  if (isUser(value)) {
    // value narrowed to User
    console.log(`User #${value.id}: ${value.name}`)
  } else {
    console.log("Bad payload")
  }
}

satisfies(設定)

satisfiesは式がConfigeに適合しているかをチェックしますが、変数のリテラル型は保持します。

type Config = { mode: "dev" | "prod"; retries: number }

const cfg = {
  mode: "prod",
  retries: 3,
  // timeout: 1000, // Error with satisfies if not in type
} satisfies Config

// cfg.mode is still the literal "prod" (not widened to string)
// and adding unknown keys raises an error at compile-time

satisfies(配列)

配列では、as const satisfiesによって要素の形状を検証します。リテラル値が保持され、自動補完も強化されます。

type Route = { path: `/${string}`; method: "GET" | "POST" }

const routes = [
  { path: "/", method: "GET" },
  { path: "/login", method: "POST" }
] as const satisfies ReadonlyArray<Route>

// each element is checked against Route, literals preserved for DX

satisfiesのチェック

クイックチェック:satisfiesは実際には何をするのでしょうか。

まとめ

まとめ:述語(x is T)は契約を表し、satisfiesは形状を確認しながらリテラル型を保持します。両方を組み合わせて使います。

よくある質問

「Predicate関数とsatisfies演算子」レッスンは無料ですか?

はい。「Predicate関数とsatisfies演算子」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、TypeScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 TypeScript Academyコースには全3レッスンが含まれています。

「Predicate関数とsatisfies演算子」で何を学びますか?

Predicateの戻り値型を持つカスタム型ガードを記述し、satisfies演算子で型を拡大せずにオブジェクトを検証します ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

TypeScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのTypeScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「Predicate関数とsatisfies演算子」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このTypeScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのTypeScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 網羅的なswitchとneverチェック
  2. Predicate関数とsatisfies演算子
  3. 関数の境界をまたぐunionの絞り込み
← TypeScript Academyに戻る