Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ポケモンの型をTypeScriptの型システムで表現してみた

 ポケモンの型をTypeScriptの型システムで表現してみた

TSKaigi Night talks 〜after conference〜 のLT資料です
https://findy.connpass.com/event/392420/

Avatar for subroh_0508

subroh_0508

June 10, 2026

More Decks by subroh_0508

Other Decks in Technology

Transcript

  1. species: regulations: - champions-m-a nature: up: down: ability: item: X

    moves: - - - - --- party: regulation: champions-m-a members: - ../individuals/garchomp.yaml - ../individuals/dragonite.yaml # … ---
  2. species: regulations: - champions-m-a moves: - - - - #

    pnpm check:individual charizard-invalid.yaml charizard-invalid.yaml:9: MoveNotLearnedBy: Type 'string' is not assignable to type 'MoveNotLearnedBy< "champions-m-a", "charizard", "surf" >'.
  3. species: regulations: - champions-m-a moves: - - - - //

    @source charizard.yaml:4 const charizard_moves_champions_m_a: ValidMoves< "champions-m-a", "charizard", readonly [ "flare-blitz", "dragon-claw", "earthquake", "roost" ] > = [ "flare-blitz", "dragon-claw", "earthquake", "roost" ]; ValidMoves charizard_moves_champions_m_a
  4. species: regulations: - champions-m-a moves: - - - - #

    // @source charizard-invalid.yaml:4 const charizard_moves_champions_m_a: ValidMoves< "champions-m-a", "charizard", readonly [ "flare-blitz", "dragon-claw", "earthquake", "surf" ] > = [ "flare-blitz", "dragon-claw", "earthquake", "surf" ];
  5. species: regulations: - champions-m-a moves: - - - - #

    // @source charizard-invalid.yaml:4 const charizard_moves_champions_m_a: ValidMoves< "champions-m-a", "charizard", readonly [ "flare-blitz", "dragon-claw", "earthquake", "surf" ] > = [ "flare-blitz", "dragon-claw", "earthquake", "surf" ]; roost surf
  6. export type ValidMoves< R extends RegulationId, // S extends SpeciesIdIn<R>,

    // Ms extends readonly string[], // > = { readonly [I in keyof Ms]: ValidMove<R, S, Ms[I] & string>; }; Ms
  7. export type ValidMove< R extends RegulationId, // S extends SpeciesIdIn<R>,

    // M extends string, // > = M extends SpeciesEntryOf< R, S >["moves"][number] ? M : MoveNotLearnedBy<R, S, M>; SpeciesEntryOf<"champions-m-a", "charizard"> { readonly id: "charizard"; readonly moves: readonly [ "flare-blitz", "dragon-claw", "roost", "earthquake", "swords-dance", ... ] // M-A ... }
  8. export type ValidMove< R extends RegulationId, // S extends SpeciesIdIn<R>,

    // M extends string, // > = M extends SpeciesEntryOf< R, S >["moves"][number] ? M : MoveNotLearnedBy<R, S, M>; M [ "flare-blitz", "dragon-claw", "earthquake", "surf" ] → [ "flare-blitz", "dragon-claw", "earthquake", MoveNotLearnedBy ]