0Pricing
TypeScript Academy · レッスン

関数と引数を安全に合成する

引数のタプルと戻り値の型を維持しながら関数を合成し、型安全なpipe/composeヘルパーを記述します

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

概要

目標: 引数の情報を失わずに関数を組み合わせます。可変長タプルを使うと、pipe/compose ヘルパー全体で完全な args タプルを保持できます。

  • 引数の個数と名前を保持する
  • 各ステップで推論を維持する
  • any もキャストも使わない

基本的な compose

compose: 最初の関数がすべての引数(...args: A)を受け取り、2 番目の関数がその出力を受け取ります。引数の個数と型は保持されます。

function compose<A extends any[], B, C>(g: (b: B) => C, f: (...args: A) => B) {
  return (...args: A): C => g(f(...args))
}

function toLen(a: string, n: number) { return `${a}${n}`.length }
function isEven(x: number) { return x % 2 === 0 }

const c1 = compose(isEven, toLen)
const ok = c1("id", 99)   // boolean

Pipe ヘルパー

pipe は同じ考え方を逆順で実装します。推論の流れがより直感的になります。

function pipe<A extends any[], B, C>(f: (...args: A) => B, g: (b: B) => C) {
  return (...args: A): C => g(f(...args))
}

const p1 = pipe(toLen, isEven)
const ok2 = p1("xx", 7) // boolean

3 つ以上の compose

3 つ以上の関数でも同じパターンを繰り返します。タプル A は保持され、中間の戻り値が連鎖します。

function compose3<A extends any[], B, C, D>(h: (c: C) => D, g: (b: B) => C, f: (...args: A) => B) {
  return (...args: A): D => h(g(f(...args)))
}

function toUpper(s: string) { return s.toUpperCase() }

const c3 = compose3(toUpper, (x: number) => x.toString(), toLen)
const val = c3("a", 5) // "2" → then upper → "2"

先頭を bind

bindHead: すべての引数を先頭に固定し、引数なしの関数を生成します。デモ用の例にすぎません(実際には Parameters を使って、より柔軟にできます)。

function bindHead<A extends any[], B>(fn: (...args: A) => B, ...head: A) {
  return (...rest: []): B => fn(...head)
}

const bh = bindHead(toLen, "x", 42)
const r = bh() // number

ヒント

ヒント:

ヘルパーでは any を避けてください。推論の連鎖が壊れてしまいます。

必要に応じて戻り値の型を明示してください。開発者体験が向上します。

複数段階の合成では、過度に汎用的なヘルパーではなく、小さなヘルパーを選んでください。

Compose シグネチャの確認

簡単な確認: 元の引数タプルを保持する compose のシグネチャはどれですか。

振り返り

振り返り: 可変長タプルで引数を保持しながら compose/pipe を作成しました。引数の個数と型を失わずに処理の流れを構築できます。

よくある質問

「関数と引数を安全に合成する」レッスンは無料ですか?

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

「関数と引数を安全に合成する」で何を学びますか?

引数のタプルと戻り値の型を維持しながら関数を合成し、型安全なpipe/composeヘルパーを記述します ブラウザで直接実行するハンズオンコードでTypeScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「関数と引数を安全に合成する」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. タプルのrest要素、curryの型
  2. 関数と引数を安全に合成する
  3. 厳密に型付けされたビルダー
← TypeScript Academyに戻る