Closed11
`@std/cli.parse-args` の型パズルを理解したい
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>;
どうやったら理解ができるか?
- 利用している型の呼び出し関係を把握してみる (普通のコードと同じ話)
- 型パズルの練習帳を1からやってみる
- ChatGPTあたりに解説してもらう
便利なリンク
思ったこと
- そもそもgenericsを使う理由は?
- extends乱立しすぎじゃない?
- utilility的な型は別の場所で定義されてるのか https://github.com/microsoft/TypeScript/blob/main/src/lib/es5.d.ts#L1600
- Args,Valuesあたりが肝?
-
// deno-lint-ignore no-explicit-any
?
諦めて愚直に手を動かす
型定義だけを取り出したもの
利用している型の呼び出し関係を把握してみる
(chatGPTに自動でやってもらいたかったができなかった)
途中
型のことを雑に把握する
ChatGPTに望みの型を聞いてみる
真面目な型の話
- extends が罠っぽい。内包表記的なことをしたいときの制約を指定する変数のために使う
- 添字でアクセスするやつはindexed access type
- keyofはオブジェクトのキーをliteral typesのunion型に変換する
- index typeのときにはstringとかstring | numberになるけれど今回はどうでも良い
conditional typesは読み直しておきたい
mapped typesも本質的にはunion typesをループしてオブジェクトを作るという所が大切でofはどうでもよく[]とinが大切。そしてasでキーの名前を変えられる。
chatgptの話
- 1度目の回答と2度目の回答は同じだけれど、chatgptはそれに気づいてなさそう
- 解説は合ってそうだけれど、章タイトル?が怪しい
- 添字の回答の部分は自分の理解が間違っているのにも関わらずそうですねと合ってるかの回答がある
類題の部分を解いてみた
inferとかわかっていない
まだやれていないことはなんだろう?
- conditional typesでinferの利用法を把握する
- 複数の配列からオブジェクトを作る
- 複数のフィールドをマージする
- 便利な型(utilities types)を利用する
↓につづく
このスクラップは6日前にクローズされました