Closed11

`@std/cli.parse-args` の型パズルを理解したい

podhmopodhmo

https://jsr.io/@std/cli/1.0.6/parse_args.ts#L483

export function parseArgs<
  TArgs extends Values<
    TBooleans,
    TStrings,
    TCollectable,
    TNegatable,
    TDefaults,
    TAliases
  >,
  TDoubleDash extends boolean | undefined = undefined,
  TBooleans extends BooleanType = undefined,
  TStrings extends StringType = undefined,
  TCollectable extends Collectable = undefined,
  TNegatable extends Negatable = undefined,
  TDefaults extends Record<string, unknown> | undefined = undefined,
  TAliases extends Aliases<TAliasArgNames, TAliasNames> | undefined = undefined,
  TAliasArgNames extends string = string,
  TAliasNames extends string = string,
>(
  args: string[],
  options?: ParseOptions<
    TBooleans,
    TStrings,
    TCollectable,
    TNegatable,
    TDefaults,
    TAliases,
    TDoubleDash
  >,
): Args<TArgs, TDoubleDash> {
    // ...
}

as を使ってる

return argv as Args<TArgs, TDoubleDash>;

https://jsr.io/@std/cli/1.0.6/parse_args.ts#L775

podhmopodhmo

どうやったら理解ができるか?

  • 利用している型の呼び出し関係を把握してみる (普通のコードと同じ話)
  • 型パズルの練習帳を1からやってみる
  • ChatGPTあたりに解説してもらう
podhmopodhmo

型のことを雑に把握する

ChatGPTに望みの型を聞いてみる

https://chatgpt.com/share/671e08cd-0da0-8001-95f6-eee85ced2e77

podhmopodhmo

真面目な型の話

  • extends が罠っぽい。内包表記的なことをしたいときの制約を指定する変数のために使う
  • 添字でアクセスするやつはindexed access type
  • keyofはオブジェクトのキーをliteral typesのunion型に変換する
    • index typeのときにはstringとかstring | numberになるけれど今回はどうでも良い

conditional typesは読み直しておきたい

https://www.typescriptlang.org/docs/handbook/2/conditional-types.html

mapped typesも本質的にはunion typesをループしてオブジェクトを作るという所が大切でofはどうでもよく[]とinが大切。そしてasでキーの名前を変えられる。

podhmopodhmo

chatgptの話

  • 1度目の回答と2度目の回答は同じだけれど、chatgptはそれに気づいてなさそう
  • 解説は合ってそうだけれど、章タイトル?が怪しい
  • 添字の回答の部分は自分の理解が間違っているのにも関わらずそうですねと合ってるかの回答がある

類題の部分を解いてみた

https://gist.github.com/podhmo/9b3fee439d488cb9c4ecfe8c6fc9d5d6

podhmopodhmo

まだやれていないことはなんだろう?

  • conditional typesでinferの利用法を把握する
  • 複数の配列からオブジェクトを作る
    • 複数のフィールドをマージする
  • 便利な型(utilities types)を利用する
このスクラップは22日前にクローズされました