TypeScriptで名前付き引数っぽい実装をする
2024/01/25

TypeScriptでは、Pythonのような関数呼び出し時に引数名を使って「名前=値」の形式で引数を指定することができません。 でも、 Options Objectパターンを使って、似たような実装をすることができます。

https://typescriptbook.jp/reference/functions/keyword-arguments-and-options-object-pattern

そして、 js.langchain のコードを見ていたら、これが、たくさん、使われてました。 例えば、以下のようなコードです。

export interface BaseLangChainParams {
    verbose?: boolean;
    callbacks?: Callbacks;
    tags?: string[];
    metadata?: Record<string, unknown>;
}

export abstract class BaseLangChain<...> extends Runnable<...>
  implements BaseLangChainParams
{
  verbose: boolean;
  callbacks?: Callbacks;
  tags?: string[];
  metadata?: Record<string, unknown>;

  constructor(params: BaseLangChainParams) {
    super(params);
    this.verbose = params.verbose ?? getVerbosity();
    this.callbacks = params.callbacks;
    this.tags = params.tags ?? [];
    this.metadata = params.metadata ?? {};
  }
  ...

引数の型が同じものが連続していると、引数を指定する順番を間違って、バグになることがあります。 でも、上記の実装方法だと、それを防げます。

const chain = new BaseLangChain({
    verbose: false,
    tags: ['hoge'],
    metadata: { fuga: false, piyo: 'PIYO' },
});

Options Objectパターンというのを知らなかったので、最初見たときに、なんのために、Xxxx クラスと XxxxParams という interface を 実装するのか疑問だったのだけど、Options Objectパターンというプログラミングのベストプラクティスに則っているのだと、わかりました。 TypeScript や Java のように名前付き引数がない言語で、引数が多いときに、このパターンが、役に立ちそうです。 interfaceの実装が必要で、少し冗長になるので、引数が多いときに限定して使うと良いように思います。

ご参考まで。

最近の記事タグ

\(^▽^*) 私たちと一緒に働いてみませんか? (*^▽^)/

少しでも興味をお持ちいただけたら、お気軽に、お問い合わせください。

採用応募受付へ

(採用応募じゃなく、ただ、会ってみたいという方も、大歓迎です。)