@mytechtoday/augment-extensions 1.7.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +240 -19
- package/augment-extensions/coding-standards/bash/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/bash/metadata.json +21 -0
- package/augment-extensions/coding-standards/c/metadata.json +50 -0
- package/augment-extensions/coding-standards/css/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/css/metadata.json +30 -0
- package/augment-extensions/coding-standards/go/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/go/metadata.json +57 -0
- package/augment-extensions/coding-standards/html/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/html/metadata.json +25 -0
- package/augment-extensions/coding-standards/html-css-js/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/html-css-js/metadata.json +40 -0
- package/augment-extensions/coding-standards/js/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/js/metadata.json +37 -0
- package/augment-extensions/coding-standards/perl/README.md +173 -0
- package/augment-extensions/coding-standards/php/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/php/metadata.json +35 -0
- package/augment-extensions/coding-standards/powershell/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/powershell/metadata.json +33 -0
- package/augment-extensions/coding-standards/python/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/python/metadata.json +38 -0
- package/augment-extensions/coding-standards/react/CHANGELOG.md +51 -0
- package/augment-extensions/coding-standards/react/metadata.json +31 -0
- package/augment-extensions/coding-standards/typescript/CHANGELOG.md +39 -0
- package/augment-extensions/coding-standards/typescript/README.md +248 -19
- package/augment-extensions/coding-standards/typescript/VERSION +2 -0
- package/augment-extensions/coding-standards/typescript/examples/biome.json +199 -0
- package/augment-extensions/coding-standards/typescript/examples/eslint-flat-config.js +166 -0
- package/augment-extensions/coding-standards/typescript/examples/monorepo-config/README.md +47 -0
- package/augment-extensions/coding-standards/typescript/examples/monorepo-config/package.json +37 -0
- package/augment-extensions/coding-standards/typescript/examples/monorepo-config/pnpm-workspace.yaml +5 -0
- package/augment-extensions/coding-standards/typescript/examples/monorepo-config/tsconfig.base.json +50 -0
- package/augment-extensions/coding-standards/typescript/examples/monorepo-config/turbo.json +47 -0
- package/augment-extensions/coding-standards/typescript/examples/vitest-setup.ts +198 -0
- package/augment-extensions/coding-standards/typescript/metadata.json +46 -0
- package/augment-extensions/coding-standards/typescript/module.json +25 -7
- package/augment-extensions/coding-standards/typescript/rules/architecture.md +1096 -0
- package/augment-extensions/coding-standards/typescript/rules/error-handling.md +1174 -0
- package/augment-extensions/coding-standards/typescript/rules/modern-features.md +625 -0
- package/augment-extensions/coding-standards/typescript/rules/monorepo.md +745 -0
- package/augment-extensions/coding-standards/typescript/rules/security-performance.md +850 -0
- package/augment-extensions/coding-standards/typescript/rules/testing.md +918 -0
- package/augment-extensions/coding-standards/typescript/rules/tooling.md +1071 -0
- package/augment-extensions/coding-standards/typescript/rules/type-patterns.md +750 -0
- package/augment-extensions/domain-rules/api-design/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/api-design/metadata.json +32 -0
- package/augment-extensions/domain-rules/database/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/database/metadata.json +50 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/dracula/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/dracula/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/monokai/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/monokai/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/nord/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/nord/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/one-dark/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/one-dark/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/one-light/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/one-light/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/metadata.json +18 -0
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/metadata.json +18 -0
- package/augment-extensions/domain-rules/mcp/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/mcp/metadata.json +42 -0
- package/augment-extensions/domain-rules/security/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/security/metadata.json +33 -0
- package/augment-extensions/domain-rules/seo-sales-marketing/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/seo-sales-marketing/metadata.json +40 -0
- package/augment-extensions/domain-rules/software-architecture/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/software-architecture/metadata.json +55 -0
- package/augment-extensions/domain-rules/wordpress/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/wordpress/metadata.json +42 -0
- package/augment-extensions/domain-rules/wordpress-plugin/CHANGELOG.md +51 -0
- package/augment-extensions/domain-rules/wordpress-plugin/metadata.json +70 -0
- package/augment-extensions/examples/design-patterns/CHANGELOG.md +51 -0
- package/augment-extensions/examples/design-patterns/metadata.json +29 -0
- package/augment-extensions/examples/gutenberg-block-plugin/CHANGELOG.md +51 -0
- package/augment-extensions/examples/gutenberg-block-plugin/metadata.json +26 -0
- package/augment-extensions/examples/rest-api-plugin/CHANGELOG.md +51 -0
- package/augment-extensions/examples/rest-api-plugin/metadata.json +27 -0
- package/augment-extensions/examples/woocommerce-extension/CHANGELOG.md +51 -0
- package/augment-extensions/examples/woocommerce-extension/metadata.json +27 -0
- package/augment-extensions/visual-design/metadata.json +34 -0
- package/augment-extensions/workflows/adr-support/CHANGELOG.md +51 -0
- package/augment-extensions/workflows/adr-support/metadata.json +41 -0
- package/augment-extensions/workflows/beads/CHANGELOG.md +51 -0
- package/augment-extensions/workflows/beads/metadata.json +23 -0
- package/augment-extensions/workflows/beads-integration/CHANGELOG.md +51 -0
- package/augment-extensions/workflows/beads-integration/metadata.json +30 -0
- package/augment-extensions/workflows/database/CHANGELOG.md +51 -0
- package/augment-extensions/workflows/database/metadata.json +30 -0
- package/augment-extensions/workflows/wordpress-plugin/CHANGELOG.md +51 -0
- package/augment-extensions/workflows/wordpress-plugin/metadata.json +41 -0
- package/augment-extensions/writing-standards/literature/shakespeare/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/literature/shakespeare/metadata.json +60 -0
- package/augment-extensions/writing-standards/screenplay/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/comedy-formats/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/comedy-formats/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/comedy-formats/monty-python/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/comedy-formats/monty-python/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/comedy-formats/saturday-night-live/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/comedy-formats/saturday-night-live/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/alfred-hitchcock/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/alfred-hitchcock/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/ari-aster/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/ari-aster/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/brad-bird/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/brad-bird/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/brian-de-palma/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/brian-de-palma/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/buster-keaton/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/buster-keaton/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/christopher-nolan/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/christopher-nolan/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/clint-eastwood/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/clint-eastwood/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/coen-brothers/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/coen-brothers/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/darren-aronofsky/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/darren-aronofsky/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/david-fincher/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/david-fincher/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/david-lynch/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/david-lynch/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/denis-villeneuve/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/denis-villeneuve/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/francis-ford-coppola/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/francis-ford-coppola/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/gary-marshall/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/gary-marshall/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/george-a-romero/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/george-a-romero/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/george-lucas/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/george-lucas/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/guillermo-del-toro/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/guillermo-del-toro/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/gus-van-sant/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/gus-van-sant/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/james-ivory-ismail-merchant/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/james-ivory-ismail-merchant/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/jim-jarmusch/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/jim-jarmusch/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/john-carpenter/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/john-carpenter/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/john-ford/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/john-ford/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/john-huston/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/john-huston/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/john-landis/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/john-landis/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/jonathan-demme/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/jonathan-demme/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/joseph-l-mankiewicz/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/joseph-l-mankiewicz/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/kathryn-bigelow/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/kathryn-bigelow/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/kelly-reichardt/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/kelly-reichardt/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/kevin-smith/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/kevin-smith/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/linda-shayne/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/linda-shayne/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/martin-scorsese/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/martin-scorsese/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/mel-brooks/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/mel-brooks/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/metadata.json +25 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/michael-curtiz/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/michael-curtiz/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/michael-mann/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/michael-mann/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/mike-nichols/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/mike-nichols/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/orson-welles/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/orson-welles/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/park-chan-wook/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/park-chan-wook/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/paul-thomas-anderson/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/paul-thomas-anderson/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/penny-marshall/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/penny-marshall/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/peter-bogdanovich/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/peter-bogdanovich/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/quentin-tarantino/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/quentin-tarantino/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/richard-linklater/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/richard-linklater/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/rob-reiner/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/rob-reiner/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/robert-altman/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/robert-altman/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/robert-eggers/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/robert-eggers/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/robert-zemeckis/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/robert-zemeckis/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/sam-peckinpah/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/sam-peckinpah/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/sidney-lumet/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/sidney-lumet/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/spike-lee/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/spike-lee/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/stanley-donen-gene-kelly/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/stanley-donen-gene-kelly/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/stanley-kubrick/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/stanley-kubrick/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/steve-martin/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/steve-martin/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/steven-spielberg/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/steven-spielberg/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/sydney-pollack/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/sydney-pollack/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/terry-gilliam/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/terry-gilliam/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/tim-burton/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/tim-burton/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/tobe-hooper/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/tobe-hooper/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/wes-anderson/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/wes-anderson/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/william-friedkin/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/directors/william-friedkin/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/films/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/films/blue-ruin/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/films/blue-ruin/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/films/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/fast-and-furious/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/fast-and-furious/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/harry-potter/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/harry-potter/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/james-bond/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/james-bond/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/john-wick/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/john-wick/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/lord-of-the-rings/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/lord-of-the-rings/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/mcu/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/mcu/metadata.json +25 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/metadata.json +25 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/star-trek/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/star-trek/metadata.json +33 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/star-wars/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/franchises/star-wars/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/metadata.json +50 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/narrative-theory/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/narrative-theory/joseph-campbell/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/narrative-theory/joseph-campbell/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/narrative-theory/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/producers/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/producers/bruckheimer-and-simpson/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/producers/bruckheimer-and-simpson/metadata.json +24 -0
- package/augment-extensions/writing-standards/screenplay/cinematic-styles/producers/metadata.json +23 -0
- package/augment-extensions/writing-standards/screenplay/genres/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/genres/metadata.json +43 -0
- package/augment-extensions/writing-standards/screenplay/metadata.json +65 -0
- package/augment-extensions/writing-standards/screenplay/styles/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/styles/metadata.json +38 -0
- package/augment-extensions/writing-standards/screenplay/themes/CHANGELOG.md +51 -0
- package/augment-extensions/writing-standards/screenplay/themes/metadata.json +47 -0
- package/cli/dist/__test_health-checker.d.ts +2 -0
- package/cli/dist/__test_health-checker.d.ts.map +1 -0
- package/cli/dist/__test_health-checker.js +4 -0
- package/cli/dist/__test_health-checker.js.map +1 -0
- package/cli/dist/__test_template-engine.d.ts +2 -0
- package/cli/dist/__test_template-engine.d.ts.map +1 -0
- package/cli/dist/__test_template-engine.js +4 -0
- package/cli/dist/__test_template-engine.js.map +1 -0
- package/cli/dist/cli.js +25 -0
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/formatter/json-formatter.d.ts +1 -0
- package/cli/dist/commands/generate-shot-list/formatter/json-formatter.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/formatter/json-formatter.js +6 -0
- package/cli/dist/commands/generate-shot-list/formatter/json-formatter.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/formatter/jsonl-formatter.d.ts +1 -0
- package/cli/dist/commands/generate-shot-list/formatter/jsonl-formatter.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/formatter/jsonl-formatter.js +6 -0
- package/cli/dist/commands/generate-shot-list/formatter/jsonl-formatter.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/formatter/markdown-formatter.d.ts +14 -0
- package/cli/dist/commands/generate-shot-list/formatter/markdown-formatter.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/formatter/markdown-formatter.js +46 -3
- package/cli/dist/commands/generate-shot-list/formatter/markdown-formatter.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/generator/context-builder.d.ts +29 -1
- package/cli/dist/commands/generate-shot-list/generator/context-builder.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/generator/context-builder.js +310 -27
- package/cli/dist/commands/generate-shot-list/generator/context-builder.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/generator/index.d.ts +26 -2
- package/cli/dist/commands/generate-shot-list/generator/index.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/generator/index.js +162 -10
- package/cli/dist/commands/generate-shot-list/generator/index.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/generator/metadata-extractor.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/generator/metadata-extractor.js +1 -0
- package/cli/dist/commands/generate-shot-list/generator/metadata-extractor.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/generator/types.d.ts +12 -2
- package/cli/dist/commands/generate-shot-list/generator/types.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/help-text.d.ts +1 -1
- package/cli/dist/commands/generate-shot-list/help-text.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/help-text.js +48 -5
- package/cli/dist/commands/generate-shot-list/help-text.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/logger/jsonl-writer.d.ts +11 -1
- package/cli/dist/commands/generate-shot-list/logger/jsonl-writer.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/logger/jsonl-writer.js +61 -1
- package/cli/dist/commands/generate-shot-list/logger/jsonl-writer.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/parser/docx-parser.d.ts +29 -0
- package/cli/dist/commands/generate-shot-list/parser/docx-parser.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/parser/docx-parser.js +111 -0
- package/cli/dist/commands/generate-shot-list/parser/docx-parser.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/parser/finaldraft-parser.d.ts +18 -0
- package/cli/dist/commands/generate-shot-list/parser/finaldraft-parser.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/parser/finaldraft-parser.js +184 -0
- package/cli/dist/commands/generate-shot-list/parser/finaldraft-parser.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/parser/index.d.ts +4 -3
- package/cli/dist/commands/generate-shot-list/parser/index.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/parser/index.js +54 -3
- package/cli/dist/commands/generate-shot-list/parser/index.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/parser/pdf-parser.d.ts +24 -0
- package/cli/dist/commands/generate-shot-list/parser/pdf-parser.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/parser/pdf-parser.js +84 -0
- package/cli/dist/commands/generate-shot-list/parser/pdf-parser.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/parser/rtf-parser.d.ts +28 -0
- package/cli/dist/commands/generate-shot-list/parser/rtf-parser.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/parser/rtf-parser.js +143 -0
- package/cli/dist/commands/generate-shot-list/parser/rtf-parser.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/parser/types.d.ts +9 -6
- package/cli/dist/commands/generate-shot-list/parser/types.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list/parser/types.js.map +1 -1
- package/cli/dist/commands/generate-shot-list/schema/shot-list.schema.json +341 -0
- package/cli/dist/commands/generate-shot-list/schema/validator.d.ts +55 -0
- package/cli/dist/commands/generate-shot-list/schema/validator.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/schema/validator.js +180 -0
- package/cli/dist/commands/generate-shot-list/schema/validator.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/guideline-parser.d.ts +36 -0
- package/cli/dist/commands/generate-shot-list/style/guideline-parser.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/guideline-parser.js +108 -0
- package/cli/dist/commands/generate-shot-list/style/guideline-parser.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/index.d.ts +39 -0
- package/cli/dist/commands/generate-shot-list/style/index.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/index.js +85 -0
- package/cli/dist/commands/generate-shot-list/style/index.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/style-loader.d.ts +35 -0
- package/cli/dist/commands/generate-shot-list/style/style-loader.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/style-loader.js +178 -0
- package/cli/dist/commands/generate-shot-list/style/style-loader.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/style-merger.d.ts +36 -0
- package/cli/dist/commands/generate-shot-list/style/style-merger.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/style-merger.js +123 -0
- package/cli/dist/commands/generate-shot-list/style/style-merger.js.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/types.d.ts +105 -0
- package/cli/dist/commands/generate-shot-list/style/types.d.ts.map +1 -0
- package/cli/dist/commands/generate-shot-list/style/types.js +8 -0
- package/cli/dist/commands/generate-shot-list/style/types.js.map +1 -0
- package/cli/dist/commands/generate-shot-list.d.ts +1 -0
- package/cli/dist/commands/generate-shot-list.d.ts.map +1 -1
- package/cli/dist/commands/generate-shot-list.js +79 -25
- package/cli/dist/commands/generate-shot-list.js.map +1 -1
- package/cli/dist/commands/list.d.ts +1 -0
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +21 -5
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/upgrade.d.ts +15 -0
- package/cli/dist/commands/upgrade.d.ts.map +1 -0
- package/cli/dist/commands/upgrade.js +229 -0
- package/cli/dist/commands/upgrade.js.map +1 -0
- package/cli/dist/commands/use.d.ts +15 -0
- package/cli/dist/commands/use.d.ts.map +1 -0
- package/cli/dist/commands/use.js +180 -0
- package/cli/dist/commands/use.js.map +1 -0
- package/cli/dist/commands/version-info.d.ts +15 -0
- package/cli/dist/commands/version-info.d.ts.map +1 -0
- package/cli/dist/commands/version-info.js +194 -0
- package/cli/dist/commands/version-info.js.map +1 -0
- package/cli/dist/core/compatibility-checker.d.ts +73 -0
- package/cli/dist/core/compatibility-checker.d.ts.map +1 -0
- package/cli/dist/core/compatibility-checker.js +188 -0
- package/cli/dist/core/compatibility-checker.js.map +1 -0
- package/cli/dist/core/index.d.ts +9 -0
- package/cli/dist/core/index.d.ts.map +1 -0
- package/cli/dist/core/index.js +16 -0
- package/cli/dist/core/index.js.map +1 -0
- package/cli/dist/core/module-loader.d.ts +68 -0
- package/cli/dist/core/module-loader.d.ts.map +1 -0
- package/cli/dist/core/module-loader.js +137 -0
- package/cli/dist/core/module-loader.js.map +1 -0
- package/cli/dist/core/version-manager.d.ts +62 -0
- package/cli/dist/core/version-manager.d.ts.map +1 -0
- package/cli/dist/core/version-manager.js +157 -0
- package/cli/dist/core/version-manager.js.map +1 -0
- package/cli/dist/core/version-resolver.d.ts +63 -0
- package/cli/dist/core/version-resolver.d.ts.map +1 -0
- package/cli/dist/core/version-resolver.js +163 -0
- package/cli/dist/core/version-resolver.js.map +1 -0
- package/cli/dist/gui/app.d.ts +17 -0
- package/cli/dist/gui/app.d.ts.map +1 -0
- package/cli/dist/gui/app.js +79 -0
- package/cli/dist/gui/app.js.map +1 -0
- package/cli/dist/gui/components/preview-pane.d.ts +40 -0
- package/cli/dist/gui/components/preview-pane.d.ts.map +1 -0
- package/cli/dist/gui/components/preview-pane.js +90 -0
- package/cli/dist/gui/components/preview-pane.js.map +1 -0
- package/cli/dist/gui/components/search-filter.d.ts +26 -0
- package/cli/dist/gui/components/search-filter.d.ts.map +1 -0
- package/cli/dist/gui/components/search-filter.js +168 -0
- package/cli/dist/gui/components/search-filter.js.map +1 -0
- package/cli/dist/gui/components/status-bar.d.ts +22 -0
- package/cli/dist/gui/components/status-bar.d.ts.map +1 -0
- package/cli/dist/gui/components/status-bar.js +58 -0
- package/cli/dist/gui/components/status-bar.js.map +1 -0
- package/cli/dist/gui/components/tree-navigator.d.ts +30 -0
- package/cli/dist/gui/components/tree-navigator.d.ts.map +1 -0
- package/cli/dist/gui/components/tree-navigator.js +133 -0
- package/cli/dist/gui/components/tree-navigator.js.map +1 -0
- package/cli/dist/gui/components/version-selector.d.ts +27 -0
- package/cli/dist/gui/components/version-selector.d.ts.map +1 -0
- package/cli/dist/gui/components/version-selector.js +110 -0
- package/cli/dist/gui/components/version-selector.js.map +1 -0
- package/cli/dist/gui/hooks/use-version-loader.d.ts +25 -0
- package/cli/dist/gui/hooks/use-version-loader.d.ts.map +1 -0
- package/cli/dist/gui/hooks/use-version-loader.js +116 -0
- package/cli/dist/gui/hooks/use-version-loader.js.map +1 -0
- package/cli/dist/gui/index.d.ts +15 -0
- package/cli/dist/gui/index.d.ts.map +1 -0
- package/cli/dist/gui/index.js +39 -0
- package/cli/dist/gui/index.js.map +1 -0
- package/cli/dist/gui/layouts/main-layout.d.ts +14 -0
- package/cli/dist/gui/layouts/main-layout.d.ts.map +1 -0
- package/cli/dist/gui/layouts/main-layout.js +205 -0
- package/cli/dist/gui/layouts/main-layout.js.map +1 -0
- package/cli/dist/gui/state/navigation-state.d.ts +39 -0
- package/cli/dist/gui/state/navigation-state.d.ts.map +1 -0
- package/cli/dist/gui/state/navigation-state.js +151 -0
- package/cli/dist/gui/state/navigation-state.js.map +1 -0
- package/cli/dist/gui/state/selection-state.d.ts +36 -0
- package/cli/dist/gui/state/selection-state.d.ts.map +1 -0
- package/cli/dist/gui/state/selection-state.js +132 -0
- package/cli/dist/gui/state/selection-state.js.map +1 -0
- package/cli/dist/gui/theme.d.ts +50 -0
- package/cli/dist/gui/theme.d.ts.map +1 -0
- package/cli/dist/gui/theme.js +73 -0
- package/cli/dist/gui/theme.js.map +1 -0
- package/cli/dist/utils/help.d.ts +13 -0
- package/cli/dist/utils/help.d.ts.map +1 -0
- package/cli/dist/utils/help.js +137 -0
- package/cli/dist/utils/help.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +8 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -1
- package/cli/dist/utils/module-system.js +38 -3
- package/cli/dist/utils/module-system.js.map +1 -1
- package/cli/dist/utils/validate-versioning.d.ts +43 -0
- package/cli/dist/utils/validate-versioning.d.ts.map +1 -0
- package/cli/dist/utils/validate-versioning.js +258 -0
- package/cli/dist/utils/validate-versioning.js.map +1 -0
- package/package.json +11 -1
|
@@ -0,0 +1,750 @@
|
|
|
1
|
+
# Advanced Type Patterns
|
|
2
|
+
|
|
3
|
+
Comprehensive guide to advanced TypeScript type patterns for building robust, type-safe applications.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
- [Branded Types](#branded-types)
|
|
7
|
+
- [Discriminated Unions](#discriminated-unions)
|
|
8
|
+
- [Type-Level Programming](#type-level-programming)
|
|
9
|
+
- [Opaque Types](#opaque-types)
|
|
10
|
+
- [Recursive Conditional Types](#recursive-conditional-types)
|
|
11
|
+
- [Mapped Types](#mapped-types)
|
|
12
|
+
- [Utility Type Patterns](#utility-type-patterns)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Branded Types
|
|
17
|
+
|
|
18
|
+
Branded types (also called nominal types) prevent accidental mixing of structurally identical types.
|
|
19
|
+
|
|
20
|
+
### Basic Branded Type
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
// ✅ Create branded types using unique symbols
|
|
24
|
+
type Brand<K, T> = K & { __brand: T };
|
|
25
|
+
|
|
26
|
+
type UserId = Brand<number, 'UserId'>;
|
|
27
|
+
type ProductId = Brand<number, 'ProductId'>;
|
|
28
|
+
type OrderId = Brand<number, 'OrderId'>;
|
|
29
|
+
|
|
30
|
+
// Helper functions to create branded values
|
|
31
|
+
function createUserId(id: number): UserId {
|
|
32
|
+
return id as UserId;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function createProductId(id: number): ProductId {
|
|
36
|
+
return id as ProductId;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Usage
|
|
40
|
+
const userId = createUserId(123);
|
|
41
|
+
const productId = createProductId(456);
|
|
42
|
+
|
|
43
|
+
function getUserById(id: UserId): User {
|
|
44
|
+
// Implementation
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
getUserById(userId); // ✅ OK
|
|
48
|
+
getUserById(productId); // ❌ Error: Argument of type 'ProductId' is not assignable to parameter of type 'UserId'
|
|
49
|
+
getUserById(123); // ❌ Error: Argument of type 'number' is not assignable to parameter of type 'UserId'
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Email Validation with Branded Types
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
// ✅ Type-safe email addresses
|
|
56
|
+
type Email = Brand<string, 'Email'>;
|
|
57
|
+
|
|
58
|
+
function createEmail(value: string): Email | null {
|
|
59
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
60
|
+
return emailRegex.test(value) ? (value as Email) : null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function sendEmail(to: Email, subject: string, body: string): void {
|
|
64
|
+
console.log(`Sending email to ${to}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const email = createEmail('user@example.com');
|
|
68
|
+
if (email) {
|
|
69
|
+
sendEmail(email, 'Hello', 'World'); // ✅ OK
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
sendEmail('invalid@', 'Hello', 'World'); // ❌ Error: Argument of type 'string' is not assignable to parameter of type 'Email'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### URL Validation
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// ✅ Type-safe URLs
|
|
79
|
+
type URL = Brand<string, 'URL'>;
|
|
80
|
+
|
|
81
|
+
function createURL(value: string): URL | null {
|
|
82
|
+
try {
|
|
83
|
+
new globalThis.URL(value);
|
|
84
|
+
return value as URL;
|
|
85
|
+
} catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function fetchData(url: URL): Promise<Response> {
|
|
91
|
+
return fetch(url);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const url = createURL('https://api.example.com/users');
|
|
95
|
+
if (url) {
|
|
96
|
+
fetchData(url); // ✅ OK
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
fetchData('not-a-url'); // ❌ Error
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Positive Numbers
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
// ✅ Branded type for positive numbers
|
|
106
|
+
type PositiveNumber = Brand<number, 'PositiveNumber'>;
|
|
107
|
+
|
|
108
|
+
function createPositiveNumber(value: number): PositiveNumber | null {
|
|
109
|
+
return value > 0 ? (value as PositiveNumber) : null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function calculateDiscount(price: PositiveNumber, percentage: PositiveNumber): number {
|
|
113
|
+
return price * (percentage / 100);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const price = createPositiveNumber(100);
|
|
117
|
+
const discount = createPositiveNumber(10);
|
|
118
|
+
|
|
119
|
+
if (price && discount) {
|
|
120
|
+
calculateDiscount(price, discount); // ✅ OK
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
calculateDiscount(100, 10); // ❌ Error
|
|
124
|
+
calculateDiscount(-50, 10); // ❌ Error (caught at runtime by createPositiveNumber)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## Discriminated Unions
|
|
130
|
+
|
|
131
|
+
Discriminated unions (tagged unions) enable type-safe handling of different variants.
|
|
132
|
+
|
|
133
|
+
### Basic Discriminated Union
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// ✅ Define discriminated union with type field
|
|
137
|
+
type Success<T> = {
|
|
138
|
+
type: 'success';
|
|
139
|
+
data: T;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
type Error = {
|
|
143
|
+
type: 'error';
|
|
144
|
+
error: string;
|
|
145
|
+
code: number;
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
type Loading = {
|
|
149
|
+
type: 'loading';
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
type Result<T> = Success<T> | Error | Loading;
|
|
153
|
+
|
|
154
|
+
// Type-safe handling
|
|
155
|
+
function handleResult<T>(result: Result<T>): void {
|
|
156
|
+
switch (result.type) {
|
|
157
|
+
case 'success':
|
|
158
|
+
console.log(result.data); // ✅ TypeScript knows result is Success<T>
|
|
159
|
+
break;
|
|
160
|
+
case 'error':
|
|
161
|
+
console.log(result.error, result.code); // ✅ TypeScript knows result is Error
|
|
162
|
+
break;
|
|
163
|
+
case 'loading':
|
|
164
|
+
console.log('Loading...'); // ✅ TypeScript knows result is Loading
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### API Response Pattern
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// ✅ Type-safe API responses
|
|
174
|
+
type ApiSuccess<T> = {
|
|
175
|
+
status: 'success';
|
|
176
|
+
data: T;
|
|
177
|
+
timestamp: Date;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
type ApiError = {
|
|
181
|
+
status: 'error';
|
|
182
|
+
message: string;
|
|
183
|
+
code: number;
|
|
184
|
+
details?: Record<string, unknown>;
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
type ApiResponse<T> = ApiSuccess<T> | ApiError;
|
|
188
|
+
|
|
189
|
+
async function fetchUser(id: number): Promise<ApiResponse<User>> {
|
|
190
|
+
try {
|
|
191
|
+
const response = await fetch(`/api/users/${id}`);
|
|
192
|
+
const data = await response.json();
|
|
193
|
+
return {
|
|
194
|
+
status: 'success',
|
|
195
|
+
data,
|
|
196
|
+
timestamp: new Date()
|
|
197
|
+
};
|
|
198
|
+
} catch (error) {
|
|
199
|
+
return {
|
|
200
|
+
status: 'error',
|
|
201
|
+
message: error.message,
|
|
202
|
+
code: 500
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Usage
|
|
208
|
+
const result = await fetchUser(123);
|
|
209
|
+
if (result.status === 'success') {
|
|
210
|
+
console.log(result.data.name); // ✅ TypeScript knows result is ApiSuccess<User>
|
|
211
|
+
} else {
|
|
212
|
+
console.log(result.message); // ✅ TypeScript knows result is ApiError
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Form State Management
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
// ✅ Type-safe form states
|
|
220
|
+
type FormIdle = {
|
|
221
|
+
state: 'idle';
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
type FormSubmitting = {
|
|
225
|
+
state: 'submitting';
|
|
226
|
+
progress: number;
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
type FormSuccess = {
|
|
230
|
+
state: 'success';
|
|
231
|
+
message: string;
|
|
232
|
+
redirectUrl?: string;
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
type FormError = {
|
|
236
|
+
state: 'error';
|
|
237
|
+
errors: Record<string, string[]>;
|
|
238
|
+
canRetry: boolean;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
type FormState = FormIdle | FormSubmitting | FormSuccess | FormError;
|
|
242
|
+
|
|
243
|
+
function renderForm(formState: FormState) {
|
|
244
|
+
switch (formState.state) {
|
|
245
|
+
case 'idle':
|
|
246
|
+
return '<form>...</form>';
|
|
247
|
+
case 'submitting':
|
|
248
|
+
return `<div>Submitting... ${formState.progress}%</div>`;
|
|
249
|
+
case 'success':
|
|
250
|
+
return `<div>${formState.message}</div>`;
|
|
251
|
+
case 'error':
|
|
252
|
+
return `<div>Errors: ${Object.keys(formState.errors).length}</div>`;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Payment Method Pattern
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
// ✅ Type-safe payment methods
|
|
261
|
+
type CreditCard = {
|
|
262
|
+
type: 'credit_card';
|
|
263
|
+
cardNumber: string;
|
|
264
|
+
expiryDate: string;
|
|
265
|
+
cvv: string;
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
type PayPal = {
|
|
269
|
+
type: 'paypal';
|
|
270
|
+
email: string;
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
type BankTransfer = {
|
|
274
|
+
type: 'bank_transfer';
|
|
275
|
+
accountNumber: string;
|
|
276
|
+
routingNumber: string;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
type PaymentMethod = CreditCard | PayPal | BankTransfer;
|
|
280
|
+
|
|
281
|
+
function processPayment(method: PaymentMethod, amount: number): void {
|
|
282
|
+
switch (method.type) {
|
|
283
|
+
case 'credit_card':
|
|
284
|
+
console.log(`Charging ${amount} to card ${method.cardNumber}`);
|
|
285
|
+
break;
|
|
286
|
+
case 'paypal':
|
|
287
|
+
console.log(`Charging ${amount} to PayPal account ${method.email}`);
|
|
288
|
+
break;
|
|
289
|
+
case 'bank_transfer':
|
|
290
|
+
console.log(`Transferring ${amount} from account ${method.accountNumber}`);
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Type-Level Programming
|
|
299
|
+
|
|
300
|
+
Perform computations at the type level using TypeScript's type system.
|
|
301
|
+
|
|
302
|
+
### Type-Level Arithmetic
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
// ✅ Type-level number operations
|
|
306
|
+
type Length<T extends readonly unknown[]> = T['length'];
|
|
307
|
+
|
|
308
|
+
type Increment<N extends number> = [unknown, ...Array<N>]['length'];
|
|
309
|
+
type Decrement<N extends number> = Array<N> extends [unknown, ...infer Rest] ? Rest['length'] : 0;
|
|
310
|
+
|
|
311
|
+
type Five = Increment<4>; // Type: 5
|
|
312
|
+
type Three = Decrement<4>; // Type: 3
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Type-Level String Manipulation
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
// ✅ Advanced string manipulation
|
|
319
|
+
type Split<S extends string, D extends string> =
|
|
320
|
+
S extends `${infer T}${D}${infer U}`
|
|
321
|
+
? [T, ...Split<U, D>]
|
|
322
|
+
: [S];
|
|
323
|
+
|
|
324
|
+
type Parts = Split<'hello-world-foo', '-'>; // Type: ["hello", "world", "foo"]
|
|
325
|
+
|
|
326
|
+
type Join<T extends readonly string[], D extends string> =
|
|
327
|
+
T extends readonly [infer F extends string, ...infer R extends readonly string[]]
|
|
328
|
+
? R extends readonly []
|
|
329
|
+
? F
|
|
330
|
+
: `${F}${D}${Join<R, D>}`
|
|
331
|
+
: '';
|
|
332
|
+
|
|
333
|
+
type Joined = Join<['hello', 'world', 'foo'], '-'>; // Type: "hello-world-foo"
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### Type-Level Filtering
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// ✅ Filter types from union
|
|
340
|
+
type Filter<T, U> = T extends U ? T : never;
|
|
341
|
+
|
|
342
|
+
type Numbers = 1 | 2 | 'a' | 'b' | 3;
|
|
343
|
+
type OnlyNumbers = Filter<Numbers, number>; // Type: 1 | 2 | 3
|
|
344
|
+
|
|
345
|
+
type Exclude<T, U> = T extends U ? never : T;
|
|
346
|
+
type OnlyStrings = Exclude<Numbers, number>; // Type: "a" | "b"
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Deep Readonly
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
// ✅ Recursively make all properties readonly
|
|
353
|
+
type DeepReadonly<T> = {
|
|
354
|
+
readonly [P in keyof T]: T[P] extends object
|
|
355
|
+
? T[P] extends Function
|
|
356
|
+
? T[P]
|
|
357
|
+
: DeepReadonly<T[P]>
|
|
358
|
+
: T[P];
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
interface Config {
|
|
362
|
+
database: {
|
|
363
|
+
host: string;
|
|
364
|
+
port: number;
|
|
365
|
+
credentials: {
|
|
366
|
+
username: string;
|
|
367
|
+
password: string;
|
|
368
|
+
};
|
|
369
|
+
};
|
|
370
|
+
cache: {
|
|
371
|
+
enabled: boolean;
|
|
372
|
+
ttl: number;
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
type ReadonlyConfig = DeepReadonly<Config>;
|
|
377
|
+
// All nested properties are readonly
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### Deep Partial
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
// ✅ Recursively make all properties optional
|
|
384
|
+
type DeepPartial<T> = {
|
|
385
|
+
[P in keyof T]?: T[P] extends object
|
|
386
|
+
? T[P] extends Function
|
|
387
|
+
? T[P]
|
|
388
|
+
: DeepPartial<T[P]>
|
|
389
|
+
: T[P];
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
type PartialConfig = DeepPartial<Config>;
|
|
393
|
+
// All nested properties are optional
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## Opaque Types
|
|
399
|
+
|
|
400
|
+
Opaque types hide implementation details while providing type safety.
|
|
401
|
+
|
|
402
|
+
### Basic Opaque Type
|
|
403
|
+
|
|
404
|
+
```typescript
|
|
405
|
+
// ✅ Create opaque type using unique symbol
|
|
406
|
+
declare const opaqueSymbol: unique symbol;
|
|
407
|
+
|
|
408
|
+
type Opaque<K, T> = K & { readonly [opaqueSymbol]: T };
|
|
409
|
+
|
|
410
|
+
type JWT = Opaque<string, 'JWT'>;
|
|
411
|
+
type SessionId = Opaque<string, 'SessionId'>;
|
|
412
|
+
|
|
413
|
+
function createJWT(payload: object): JWT {
|
|
414
|
+
// Implementation
|
|
415
|
+
return 'encoded.jwt.token' as JWT;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function verifyJWT(token: JWT): object {
|
|
419
|
+
// Implementation
|
|
420
|
+
return {};
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
const token = createJWT({ userId: 123 });
|
|
424
|
+
verifyJWT(token); // ✅ OK
|
|
425
|
+
verifyJWT('random-string'); // ❌ Error
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### Database ID Pattern
|
|
429
|
+
|
|
430
|
+
```typescript
|
|
431
|
+
// ✅ Type-safe database IDs
|
|
432
|
+
type DatabaseId<T extends string> = Opaque<string, T>;
|
|
433
|
+
|
|
434
|
+
type UserId = DatabaseId<'User'>;
|
|
435
|
+
type PostId = DatabaseId<'Post'>;
|
|
436
|
+
type CommentId = DatabaseId<'Comment'>;
|
|
437
|
+
|
|
438
|
+
function createUserId(id: string): UserId {
|
|
439
|
+
return id as UserId;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
function createPostId(id: string): PostId {
|
|
443
|
+
return id as PostId;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function getUser(id: UserId): Promise<User> {
|
|
447
|
+
return fetch(`/api/users/${id}`).then(r => r.json());
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
function getPost(id: PostId): Promise<Post> {
|
|
451
|
+
return fetch(`/api/posts/${id}`).then(r => r.json());
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const userId = createUserId('user-123');
|
|
455
|
+
const postId = createPostId('post-456');
|
|
456
|
+
|
|
457
|
+
getUser(userId); // ✅ OK
|
|
458
|
+
getUser(postId); // ❌ Error: Argument of type 'PostId' is not assignable to parameter of type 'UserId'
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
## Recursive Conditional Types
|
|
464
|
+
|
|
465
|
+
Build complex type transformations using recursion.
|
|
466
|
+
|
|
467
|
+
### Deep Flatten
|
|
468
|
+
|
|
469
|
+
```typescript
|
|
470
|
+
// ✅ Recursively flatten nested arrays
|
|
471
|
+
type Flatten<T> = T extends readonly (infer U)[]
|
|
472
|
+
? Flatten<U>
|
|
473
|
+
: T;
|
|
474
|
+
|
|
475
|
+
type Nested = [1, [2, [3, [4, 5]]]];
|
|
476
|
+
type Flat = Flatten<Nested>; // Type: 1 | 2 | 3 | 4 | 5
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### Deep Pick
|
|
480
|
+
|
|
481
|
+
```typescript
|
|
482
|
+
// ✅ Pick nested properties using dot notation
|
|
483
|
+
type DeepPick<T, K extends string> =
|
|
484
|
+
K extends `${infer K1}.${infer K2}`
|
|
485
|
+
? K1 extends keyof T
|
|
486
|
+
? { [P in K1]: DeepPick<T[K1], K2> }
|
|
487
|
+
: never
|
|
488
|
+
: K extends keyof T
|
|
489
|
+
? { [P in K]: T[P] }
|
|
490
|
+
: never;
|
|
491
|
+
|
|
492
|
+
interface User {
|
|
493
|
+
id: number;
|
|
494
|
+
profile: {
|
|
495
|
+
name: string;
|
|
496
|
+
address: {
|
|
497
|
+
street: string;
|
|
498
|
+
city: string;
|
|
499
|
+
country: string;
|
|
500
|
+
};
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
type UserCity = DeepPick<User, 'profile.address.city'>;
|
|
505
|
+
// Type: { profile: { address: { city: string } } }
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### Path to Property
|
|
509
|
+
|
|
510
|
+
```typescript
|
|
511
|
+
// ✅ Generate all possible paths to properties
|
|
512
|
+
type Paths<T, Prefix extends string = ''> = {
|
|
513
|
+
[K in keyof T]: T[K] extends object
|
|
514
|
+
? T[K] extends Function
|
|
515
|
+
? `${Prefix}${K & string}`
|
|
516
|
+
: `${Prefix}${K & string}` | Paths<T[K], `${Prefix}${K & string}.`>
|
|
517
|
+
: `${Prefix}${K & string}`;
|
|
518
|
+
}[keyof T];
|
|
519
|
+
|
|
520
|
+
type UserPaths = Paths<User>;
|
|
521
|
+
// Type: "id" | "profile" | "profile.name" | "profile.address" |
|
|
522
|
+
// "profile.address.street" | "profile.address.city" | "profile.address.country"
|
|
523
|
+
```
|
|
524
|
+
|
|
525
|
+
### JSON Serialization
|
|
526
|
+
|
|
527
|
+
```typescript
|
|
528
|
+
// ✅ Type-safe JSON serialization
|
|
529
|
+
type Serializable<T> = T extends string | number | boolean | null
|
|
530
|
+
? T
|
|
531
|
+
: T extends Date
|
|
532
|
+
? string
|
|
533
|
+
: T extends Array<infer U>
|
|
534
|
+
? Array<Serializable<U>>
|
|
535
|
+
: T extends object
|
|
536
|
+
? { [K in keyof T]: Serializable<T[K]> }
|
|
537
|
+
: never;
|
|
538
|
+
|
|
539
|
+
interface UserWithDate {
|
|
540
|
+
id: number;
|
|
541
|
+
name: string;
|
|
542
|
+
createdAt: Date;
|
|
543
|
+
metadata: {
|
|
544
|
+
lastLogin: Date;
|
|
545
|
+
preferences: {
|
|
546
|
+
theme: string;
|
|
547
|
+
};
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
type SerializedUser = Serializable<UserWithDate>;
|
|
552
|
+
// Type: {
|
|
553
|
+
// id: number;
|
|
554
|
+
// name: string;
|
|
555
|
+
// createdAt: string; // Date becomes string
|
|
556
|
+
// metadata: {
|
|
557
|
+
// lastLogin: string; // Date becomes string
|
|
558
|
+
// preferences: {
|
|
559
|
+
// theme: string;
|
|
560
|
+
// };
|
|
561
|
+
// };
|
|
562
|
+
// }
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
---
|
|
566
|
+
|
|
567
|
+
## Mapped Types
|
|
568
|
+
|
|
569
|
+
Transform existing types into new types.
|
|
570
|
+
|
|
571
|
+
### Make Properties Optional
|
|
572
|
+
|
|
573
|
+
```typescript
|
|
574
|
+
// ✅ Make specific properties optional
|
|
575
|
+
type MakeOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
576
|
+
|
|
577
|
+
interface User {
|
|
578
|
+
id: number;
|
|
579
|
+
name: string;
|
|
580
|
+
email: string;
|
|
581
|
+
phone: string;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
type UserWithOptionalContact = MakeOptional<User, 'email' | 'phone'>;
|
|
585
|
+
// Type: {
|
|
586
|
+
// id: number;
|
|
587
|
+
// name: string;
|
|
588
|
+
// email?: string;
|
|
589
|
+
// phone?: string;
|
|
590
|
+
// }
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
### Make Properties Required
|
|
594
|
+
|
|
595
|
+
```typescript
|
|
596
|
+
// ✅ Make specific properties required
|
|
597
|
+
type MakeRequired<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
|
|
598
|
+
|
|
599
|
+
interface PartialUser {
|
|
600
|
+
id?: number;
|
|
601
|
+
name?: string;
|
|
602
|
+
email?: string;
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
type UserWithRequiredId = MakeRequired<PartialUser, 'id'>;
|
|
606
|
+
// Type: {
|
|
607
|
+
// id: number;
|
|
608
|
+
// name?: string;
|
|
609
|
+
// email?: string;
|
|
610
|
+
// }
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
### Mutable
|
|
614
|
+
|
|
615
|
+
```typescript
|
|
616
|
+
// ✅ Remove readonly modifiers
|
|
617
|
+
type Mutable<T> = {
|
|
618
|
+
-readonly [P in keyof T]: T[P];
|
|
619
|
+
};
|
|
620
|
+
|
|
621
|
+
interface ReadonlyUser {
|
|
622
|
+
readonly id: number;
|
|
623
|
+
readonly name: string;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
type MutableUser = Mutable<ReadonlyUser>;
|
|
627
|
+
// Type: {
|
|
628
|
+
// id: number;
|
|
629
|
+
// name: string;
|
|
630
|
+
// }
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
### Nullable
|
|
634
|
+
|
|
635
|
+
```typescript
|
|
636
|
+
// ✅ Make all properties nullable
|
|
637
|
+
type Nullable<T> = {
|
|
638
|
+
[P in keyof T]: T[P] | null;
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
interface User {
|
|
642
|
+
id: number;
|
|
643
|
+
name: string;
|
|
644
|
+
email: string;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
type NullableUser = Nullable<User>;
|
|
648
|
+
// Type: {
|
|
649
|
+
// id: number | null;
|
|
650
|
+
// name: string | null;
|
|
651
|
+
// email: string | null;
|
|
652
|
+
// }
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
---
|
|
656
|
+
|
|
657
|
+
## Utility Type Patterns
|
|
658
|
+
|
|
659
|
+
Advanced patterns using TypeScript's built-in utility types.
|
|
660
|
+
|
|
661
|
+
### Extract Function Parameters
|
|
662
|
+
|
|
663
|
+
```typescript
|
|
664
|
+
// ✅ Extract parameter types from function
|
|
665
|
+
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
|
|
666
|
+
|
|
667
|
+
function createUser(name: string, email: string, age: number): User {
|
|
668
|
+
return { id: 1, name, email, age };
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
type CreateUserParams = Parameters<typeof createUser>;
|
|
672
|
+
// Type: [name: string, email: string, age: number]
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
### Extract Return Type
|
|
676
|
+
|
|
677
|
+
```typescript
|
|
678
|
+
// ✅ Extract return type from function
|
|
679
|
+
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : never;
|
|
680
|
+
|
|
681
|
+
type UserReturnType = ReturnType<typeof createUser>;
|
|
682
|
+
// Type: User
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
### Awaited Type
|
|
686
|
+
|
|
687
|
+
```typescript
|
|
688
|
+
// ✅ Unwrap Promise types
|
|
689
|
+
type Awaited<T> = T extends Promise<infer U> ? Awaited<U> : T;
|
|
690
|
+
|
|
691
|
+
async function fetchUser(): Promise<User> {
|
|
692
|
+
return { id: 1, name: 'Alice', email: 'alice@example.com' };
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
type FetchedUser = Awaited<ReturnType<typeof fetchUser>>;
|
|
696
|
+
// Type: User
|
|
697
|
+
```
|
|
698
|
+
|
|
699
|
+
### Constructor Parameters
|
|
700
|
+
|
|
701
|
+
```typescript
|
|
702
|
+
// ✅ Extract constructor parameter types
|
|
703
|
+
type ConstructorParameters<T extends abstract new (...args: any) => any> =
|
|
704
|
+
T extends abstract new (...args: infer P) => any ? P : never;
|
|
705
|
+
|
|
706
|
+
class User {
|
|
707
|
+
constructor(public name: string, public email: string) {}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
type UserConstructorParams = ConstructorParameters<typeof User>;
|
|
711
|
+
// Type: [name: string, email: string]
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
---
|
|
715
|
+
|
|
716
|
+
## Best Practices
|
|
717
|
+
|
|
718
|
+
1. **Use branded types** for domain-specific primitives (IDs, emails, URLs)
|
|
719
|
+
2. **Leverage discriminated unions** for state management and API responses
|
|
720
|
+
3. **Apply type-level programming** for complex type transformations
|
|
721
|
+
4. **Use opaque types** to hide implementation details
|
|
722
|
+
5. **Employ recursive conditional types** for deep type operations
|
|
723
|
+
6. **Utilize mapped types** for type transformations
|
|
724
|
+
7. **Combine patterns** for maximum type safety
|
|
725
|
+
8. **Document complex types** with comments explaining the pattern
|
|
726
|
+
9. **Test types** using type assertions and test files
|
|
727
|
+
10. **Keep types simple** when possible - complexity should serve a purpose
|
|
728
|
+
|
|
729
|
+
---
|
|
730
|
+
|
|
731
|
+
## Examples
|
|
732
|
+
|
|
733
|
+
See the `examples/` directory for complete working examples:
|
|
734
|
+
- `examples/branded-types.ts` - Branded type implementations
|
|
735
|
+
- `examples/discriminated-unions.ts` - Union type patterns
|
|
736
|
+
- `examples/type-level-programming.ts` - Advanced type computations
|
|
737
|
+
- `examples/opaque-types.ts` - Opaque type patterns
|
|
738
|
+
- `examples/recursive-types.ts` - Recursive type transformations
|
|
739
|
+
|
|
740
|
+
---
|
|
741
|
+
|
|
742
|
+
## References
|
|
743
|
+
|
|
744
|
+
- [TypeScript Handbook - Advanced Types](https://www.typescriptlang.org/docs/handbook/2/types-from-types.html)
|
|
745
|
+
- [TypeScript Deep Dive - Advanced Types](https://basarat.gitbook.io/typescript/type-system)
|
|
746
|
+
- [Type Challenges](https://github.com/type-challenges/type-challenges)
|
|
747
|
+
- [Branded Types in TypeScript](https://egghead.io/blog/using-branded-types-in-typescript)
|
|
748
|
+
|
|
749
|
+
|
|
750
|
+
|