aigroup-workflow 2.2.0 → 2.2.2
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/.claude/commands/fix-build.md +10 -5
- package/.claude/commands/init-project.md +13 -8
- package/.claude/commands/plan.md +15 -8
- package/.claude/commands/review.md +12 -6
- package/.claude/commands/tdd.md +11 -5
- package/.claude/commands/workflow-start.md +20 -11
- package/.claude/settings.json +28 -0
- package/.codex/agents/architect.toml +207 -0
- package/.codex/agents/build-error-resolver.toml +110 -0
- package/.codex/agents/code-reviewer.toml +233 -0
- package/.codex/agents/doc-updater.toml +103 -0
- package/.codex/agents/e2e-runner.toml +103 -0
- package/.codex/agents/get-current-datetime.toml +23 -0
- package/.codex/agents/init-architect.toml +181 -0
- package/.codex/agents/planner.toml +208 -0
- package/.codex/agents/refactor-cleaner.toml +81 -0
- package/.codex/agents/rust-reviewer.toml +90 -0
- package/.codex/agents/security-reviewer.toml +104 -0
- package/.codex/agents/tdd-guide.toml +87 -0
- package/AGENTS.md +2 -2
- package/CLAUDE.md +23 -1
- package/LICENSE +20 -20
- package/README.md +333 -333
- package/agents/a11y-architect.md +141 -141
- package/agents/architect.md +211 -211
- package/agents/build-error-resolver.md +114 -114
- package/agents/chief-of-staff.md +151 -151
- package/agents/code-architect.md +71 -71
- package/agents/code-explorer.md +69 -69
- package/agents/code-reviewer.md +237 -237
- package/agents/code-simplifier.md +47 -47
- package/agents/comment-analyzer.md +45 -45
- package/agents/conversation-analyzer.md +52 -52
- package/agents/cpp-build-resolver.md +90 -90
- package/agents/cpp-reviewer.md +72 -72
- package/agents/csharp-reviewer.md +101 -101
- package/agents/dart-build-resolver.md +201 -201
- package/agents/database-reviewer.md +91 -91
- package/agents/doc-updater.md +107 -107
- package/agents/docs-lookup.md +68 -68
- package/agents/e2e-runner.md +107 -107
- package/agents/flutter-reviewer.md +243 -243
- package/agents/gan-evaluator.md +209 -209
- package/agents/gan-generator.md +131 -131
- package/agents/gan-planner.md +99 -99
- package/agents/get-current-datetime.md +26 -26
- package/agents/go-build-resolver.md +94 -94
- package/agents/go-reviewer.md +76 -76
- package/agents/harness-optimizer.md +35 -35
- package/agents/healthcare-reviewer.md +83 -83
- package/agents/java-build-resolver.md +153 -153
- package/agents/java-reviewer.md +92 -92
- package/agents/kotlin-build-resolver.md +118 -118
- package/agents/kotlin-reviewer.md +159 -159
- package/agents/loop-operator.md +36 -36
- package/agents/opensource-forker.md +198 -198
- package/agents/opensource-packager.md +249 -249
- package/agents/opensource-sanitizer.md +188 -188
- package/agents/performance-optimizer.md +446 -446
- package/agents/planner.md +212 -212
- package/agents/pr-test-analyzer.md +45 -45
- package/agents/python-reviewer.md +98 -98
- package/agents/pytorch-build-resolver.md +120 -120
- package/agents/refactor-cleaner.md +85 -85
- package/agents/rust-build-resolver.md +148 -148
- package/agents/rust-reviewer.md +94 -94
- package/agents/security-reviewer.md +108 -108
- package/agents/seo-specialist.md +59 -59
- package/agents/silent-failure-hunter.md +50 -50
- package/agents/tdd-guide.md +91 -91
- package/agents/type-design-analyzer.md +41 -41
- package/agents/typescript-reviewer.md +112 -112
- package/cli/commands/update.mjs +1 -1
- package/cli/utils/scaffold.mjs +53 -0
- package/docs/rules/agents.md +166 -50
- package/docs/rules/cpp/coding-style.md +44 -44
- package/docs/rules/cpp/hooks.md +39 -39
- package/docs/rules/cpp/patterns.md +51 -51
- package/docs/rules/cpp/security.md +51 -51
- package/docs/rules/cpp/testing.md +44 -44
- package/docs/rules/csharp/coding-style.md +72 -72
- package/docs/rules/csharp/hooks.md +25 -25
- package/docs/rules/csharp/patterns.md +50 -50
- package/docs/rules/csharp/security.md +58 -58
- package/docs/rules/csharp/testing.md +46 -46
- package/docs/rules/dart/coding-style.md +159 -159
- package/docs/rules/dart/hooks.md +66 -66
- package/docs/rules/dart/patterns.md +261 -261
- package/docs/rules/dart/security.md +135 -135
- package/docs/rules/dart/testing.md +215 -215
- package/docs/rules/golang/coding-style.md +32 -32
- package/docs/rules/golang/hooks.md +17 -17
- package/docs/rules/golang/patterns.md +45 -45
- package/docs/rules/golang/security.md +34 -34
- package/docs/rules/golang/testing.md +31 -31
- package/docs/rules/java/coding-style.md +114 -114
- package/docs/rules/java/hooks.md +18 -18
- package/docs/rules/java/patterns.md +146 -146
- package/docs/rules/java/security.md +100 -100
- package/docs/rules/java/testing.md +131 -131
- package/docs/rules/kotlin/coding-style.md +86 -86
- package/docs/rules/kotlin/hooks.md +17 -17
- package/docs/rules/kotlin/patterns.md +146 -146
- package/docs/rules/kotlin/security.md +82 -82
- package/docs/rules/kotlin/testing.md +128 -128
- package/docs/rules/perl/coding-style.md +46 -46
- package/docs/rules/perl/hooks.md +22 -22
- package/docs/rules/perl/patterns.md +76 -76
- package/docs/rules/perl/security.md +69 -69
- package/docs/rules/perl/testing.md +54 -54
- package/docs/rules/php/coding-style.md +40 -40
- package/docs/rules/php/hooks.md +24 -24
- package/docs/rules/php/patterns.md +33 -33
- package/docs/rules/php/security.md +37 -37
- package/docs/rules/php/testing.md +39 -39
- package/docs/rules/python/coding-style.md +42 -42
- package/docs/rules/python/hooks.md +19 -19
- package/docs/rules/python/patterns.md +39 -39
- package/docs/rules/python/security.md +30 -30
- package/docs/rules/python/testing.md +38 -38
- package/docs/rules/rust/coding-style.md +151 -151
- package/docs/rules/rust/hooks.md +16 -16
- package/docs/rules/rust/patterns.md +168 -168
- package/docs/rules/rust/security.md +141 -141
- package/docs/rules/rust/testing.md +154 -154
- package/docs/rules/swift/coding-style.md +47 -47
- package/docs/rules/swift/hooks.md +20 -20
- package/docs/rules/swift/patterns.md +66 -66
- package/docs/rules/swift/security.md +33 -33
- package/docs/rules/swift/testing.md +45 -45
- package/docs/rules/typescript/coding-style.md +199 -199
- package/docs/rules/typescript/hooks.md +22 -22
- package/docs/rules/typescript/patterns.md +52 -52
- package/docs/rules/typescript/security.md +28 -28
- package/docs/rules/typescript/testing.md +18 -18
- package/docs/rules/web/coding-style.md +96 -96
- package/docs/rules/web/design-quality.md +62 -62
- package/docs/rules/web/hooks.md +120 -120
- package/docs/rules/web/patterns.md +79 -79
- package/docs/rules/web/performance.md +64 -64
- package/docs/rules/web/security.md +57 -57
- package/docs/rules/web/testing.md +55 -55
- package/docs/templates/README.md +36 -36
- package/docs/templates/ai-project-final.md +124 -124
- package/docs/templates/ai-project.md +105 -105
- package/docs/templates/api.md +157 -157
- package/docs/templates/bug.md +62 -62
- package/docs/templates/code-review.md +87 -87
- package/docs/templates/generic.md +116 -116
- package/docs/templates/implementation-plan.md +1 -1
- package/docs/templates/meeting.md +68 -68
- package/docs/templates/prd.md +98 -98
- package/docs/templates/ui.md +134 -134
- package/docs/workflow-pipeline.md +11 -10
- package/package.json +40 -39
- package/scripts/hooks/checks/orchestration-artifacts.cjs +28 -23
- package/scripts/hooks/checks/workflow-state.cjs +4 -5
- package/scripts/orchestration/lib/orchestrator.cjs +344 -117
- package/scripts/orchestration/lib/validate.cjs +145 -0
- package/scripts/orchestration/session.cjs +88 -44
- package/skills/SUPERPOWERS-LICENSE +21 -21
- package/skills/ai-ml/fine-tuning-expert/SKILL.md +162 -162
- package/skills/ai-ml/fine-tuning-expert/references/dataset-preparation.md +540 -540
- package/skills/ai-ml/fine-tuning-expert/references/deployment-optimization.md +673 -673
- package/skills/ai-ml/fine-tuning-expert/references/evaluation-metrics.md +597 -597
- package/skills/ai-ml/fine-tuning-expert/references/hyperparameter-tuning.md +565 -565
- package/skills/ai-ml/fine-tuning-expert/references/lora-peft.md +347 -347
- package/skills/ai-ml/ml-pipeline/SKILL.md +159 -159
- package/skills/ai-ml/ml-pipeline/references/experiment-tracking.md +833 -833
- package/skills/ai-ml/ml-pipeline/references/feature-engineering.md +631 -631
- package/skills/ai-ml/ml-pipeline/references/model-validation.md +978 -978
- package/skills/ai-ml/ml-pipeline/references/pipeline-orchestration.md +907 -907
- package/skills/ai-ml/ml-pipeline/references/training-pipelines.md +782 -782
- package/skills/ai-ml/rag-architect/SKILL.md +194 -194
- package/skills/ai-ml/rag-architect/references/chunking-strategies.md +878 -878
- package/skills/ai-ml/rag-architect/references/embedding-models.md +561 -561
- package/skills/ai-ml/rag-architect/references/rag-evaluation.md +833 -833
- package/skills/ai-ml/rag-architect/references/retrieval-optimization.md +795 -795
- package/skills/ai-ml/rag-architect/references/vector-databases.md +589 -589
- package/skills/ai-ml/spark-engineer/SKILL.md +148 -148
- package/skills/ai-ml/spark-engineer/references/partitioning-caching.md +543 -543
- package/skills/ai-ml/spark-engineer/references/performance-tuning.md +544 -544
- package/skills/ai-ml/spark-engineer/references/rdd-operations.md +599 -599
- package/skills/ai-ml/spark-engineer/references/spark-sql-dataframes.md +474 -474
- package/skills/ai-ml/spark-engineer/references/streaming-patterns.md +786 -786
- package/skills/backend/api-designer/SKILL.md +217 -217
- package/skills/backend/api-designer/references/error-handling.md +541 -541
- package/skills/backend/api-designer/references/openapi.md +824 -824
- package/skills/backend/api-designer/references/pagination.md +494 -494
- package/skills/backend/api-designer/references/rest-patterns.md +335 -335
- package/skills/backend/api-designer/references/versioning.md +391 -391
- package/skills/backend/architecture-designer/SKILL.md +117 -117
- package/skills/backend/architecture-designer/references/adr-template.md +116 -116
- package/skills/backend/architecture-designer/references/architecture-patterns.md +111 -111
- package/skills/backend/architecture-designer/references/database-selection.md +102 -102
- package/skills/backend/architecture-designer/references/nfr-checklist.md +112 -112
- package/skills/backend/architecture-designer/references/system-design.md +100 -100
- package/skills/backend/code-documenter/SKILL.md +147 -147
- package/skills/backend/code-documenter/references/api-docs-fastapi-django.md +166 -166
- package/skills/backend/code-documenter/references/api-docs-nestjs-express.md +220 -220
- package/skills/backend/code-documenter/references/coverage-reports.md +125 -125
- package/skills/backend/code-documenter/references/documentation-systems.md +333 -333
- package/skills/backend/code-documenter/references/interactive-api-docs.md +531 -531
- package/skills/backend/code-documenter/references/python-docstrings.md +121 -121
- package/skills/backend/code-documenter/references/typescript-jsdoc.md +145 -145
- package/skills/backend/code-documenter/references/user-guides-tutorials.md +530 -530
- package/skills/backend/debugging-wizard/SKILL.md +105 -105
- package/skills/backend/debugging-wizard/references/common-patterns.md +132 -132
- package/skills/backend/debugging-wizard/references/debugging-tools.md +140 -140
- package/skills/backend/debugging-wizard/references/quick-fixes.md +177 -177
- package/skills/backend/debugging-wizard/references/strategies.md +142 -142
- package/skills/backend/debugging-wizard/references/systematic-debugging.md +367 -367
- package/skills/backend/feature-forge/SKILL.md +98 -98
- package/skills/backend/feature-forge/references/acceptance-criteria.md +104 -104
- package/skills/backend/feature-forge/references/ears-syntax.md +99 -99
- package/skills/backend/feature-forge/references/interview-questions.md +150 -150
- package/skills/backend/feature-forge/references/pre-discovery-subagents.md +54 -54
- package/skills/backend/feature-forge/references/specification-template.md +103 -103
- package/skills/backend/fullstack-guardian/SKILL.md +105 -105
- package/skills/backend/fullstack-guardian/references/api-design-standards.md +307 -307
- package/skills/backend/fullstack-guardian/references/architecture-decisions.md +350 -350
- package/skills/backend/fullstack-guardian/references/backend-patterns.md +237 -237
- package/skills/backend/fullstack-guardian/references/common-patterns.md +134 -134
- package/skills/backend/fullstack-guardian/references/deliverables-checklist.md +354 -354
- package/skills/backend/fullstack-guardian/references/design-template.md +91 -91
- package/skills/backend/fullstack-guardian/references/error-handling.md +135 -135
- package/skills/backend/fullstack-guardian/references/frontend-patterns.md +340 -340
- package/skills/backend/fullstack-guardian/references/integration-patterns.md +333 -333
- package/skills/backend/fullstack-guardian/references/security-checklist.md +106 -106
- package/skills/backend/graphql-architect/SKILL.md +146 -146
- package/skills/backend/graphql-architect/references/federation.md +418 -418
- package/skills/backend/graphql-architect/references/migration-from-rest.md +1141 -1141
- package/skills/backend/graphql-architect/references/resolvers.md +425 -425
- package/skills/backend/graphql-architect/references/schema-design.md +393 -393
- package/skills/backend/graphql-architect/references/security.md +569 -569
- package/skills/backend/graphql-architect/references/subscriptions.md +510 -510
- package/skills/backend/legacy-modernizer/SKILL.md +137 -137
- package/skills/backend/legacy-modernizer/references/legacy-testing.md +381 -381
- package/skills/backend/legacy-modernizer/references/migration-strategies.md +423 -423
- package/skills/backend/legacy-modernizer/references/refactoring-patterns.md +395 -395
- package/skills/backend/legacy-modernizer/references/strangler-fig-pattern.md +281 -281
- package/skills/backend/legacy-modernizer/references/system-assessment.md +487 -487
- package/skills/backend/microservices-architect/SKILL.md +164 -164
- package/skills/backend/microservices-architect/references/communication.md +499 -499
- package/skills/backend/microservices-architect/references/data.md +721 -721
- package/skills/backend/microservices-architect/references/decomposition.md +344 -344
- package/skills/backend/microservices-architect/references/observability.md +805 -805
- package/skills/backend/microservices-architect/references/patterns.md +603 -603
- package/skills/database/database-optimizer/SKILL.md +147 -147
- package/skills/database/database-optimizer/references/index-strategies.md +331 -331
- package/skills/database/database-optimizer/references/monitoring-analysis.md +501 -501
- package/skills/database/database-optimizer/references/mysql-tuning.md +452 -452
- package/skills/database/database-optimizer/references/postgresql-tuning.md +413 -413
- package/skills/database/database-optimizer/references/query-optimization.md +251 -251
- package/skills/database/postgres-pro/SKILL.md +152 -152
- package/skills/database/postgres-pro/references/extensions.md +404 -404
- package/skills/database/postgres-pro/references/jsonb.md +321 -321
- package/skills/database/postgres-pro/references/maintenance.md +481 -481
- package/skills/database/postgres-pro/references/performance.md +265 -265
- package/skills/database/postgres-pro/references/replication.md +446 -446
- package/skills/database/sql-pro/SKILL.md +129 -129
- package/skills/database/sql-pro/references/database-design.md +402 -402
- package/skills/database/sql-pro/references/dialect-differences.md +419 -419
- package/skills/database/sql-pro/references/optimization.md +384 -384
- package/skills/database/sql-pro/references/query-patterns.md +285 -285
- package/skills/database/sql-pro/references/window-functions.md +328 -328
- package/skills/dotnet/csharp-developer/SKILL.md +125 -125
- package/skills/dotnet/csharp-developer/references/aspnet-core.md +394 -394
- package/skills/dotnet/csharp-developer/references/blazor.md +553 -553
- package/skills/dotnet/csharp-developer/references/entity-framework.md +409 -409
- package/skills/dotnet/csharp-developer/references/modern-csharp.md +248 -248
- package/skills/dotnet/csharp-developer/references/performance.md +498 -498
- package/skills/dotnet/dotnet-core-expert/SKILL.md +138 -138
- package/skills/dotnet/dotnet-core-expert/references/authentication.md +546 -546
- package/skills/dotnet/dotnet-core-expert/references/clean-architecture.md +455 -455
- package/skills/dotnet/dotnet-core-expert/references/cloud-native.md +548 -548
- package/skills/dotnet/dotnet-core-expert/references/entity-framework.md +440 -440
- package/skills/dotnet/dotnet-core-expert/references/minimal-apis.md +319 -319
- package/skills/frontend/angular-architect/SKILL.md +152 -152
- package/skills/frontend/angular-architect/references/components.md +297 -297
- package/skills/frontend/angular-architect/references/ngrx.md +401 -401
- package/skills/frontend/angular-architect/references/routing.md +361 -361
- package/skills/frontend/angular-architect/references/rxjs.md +319 -319
- package/skills/frontend/angular-architect/references/testing.md +405 -405
- package/skills/frontend/design-commands/design.md +91 -91
- package/skills/frontend/design-commands/handoff.md +97 -97
- package/skills/frontend/design-commands/prototype.md +120 -120
- package/skills/frontend/design-commands/spec.md +160 -160
- package/skills/frontend/design-commands/style.md +78 -78
- package/skills/frontend/flutter-expert/SKILL.md +138 -138
- package/skills/frontend/flutter-expert/references/bloc-state.md +259 -259
- package/skills/frontend/flutter-expert/references/gorouter-navigation.md +119 -119
- package/skills/frontend/flutter-expert/references/performance.md +99 -99
- package/skills/frontend/flutter-expert/references/project-structure.md +118 -118
- package/skills/frontend/flutter-expert/references/riverpod-state.md +130 -130
- package/skills/frontend/flutter-expert/references/widget-patterns.md +123 -123
- package/skills/frontend/nextjs-developer/SKILL.md +143 -143
- package/skills/frontend/nextjs-developer/references/app-router.md +311 -311
- package/skills/frontend/nextjs-developer/references/data-fetching.md +482 -482
- package/skills/frontend/nextjs-developer/references/deployment.md +545 -545
- package/skills/frontend/nextjs-developer/references/server-actions.md +462 -462
- package/skills/frontend/nextjs-developer/references/server-components.md +384 -384
- package/skills/frontend/react-expert/SKILL.md +149 -149
- package/skills/frontend/react-expert/references/hooks-patterns.md +162 -162
- package/skills/frontend/react-expert/references/migration-class-to-modern.md +1119 -1119
- package/skills/frontend/react-expert/references/performance.md +168 -168
- package/skills/frontend/react-expert/references/react-19-features.md +174 -174
- package/skills/frontend/react-expert/references/server-components.md +143 -143
- package/skills/frontend/react-expert/references/state-management.md +171 -171
- package/skills/frontend/react-expert/references/testing-react.md +174 -174
- package/skills/frontend/react-native-expert/SKILL.md +185 -185
- package/skills/frontend/react-native-expert/references/expo-router.md +187 -187
- package/skills/frontend/react-native-expert/references/list-optimization.md +204 -204
- package/skills/frontend/react-native-expert/references/platform-handling.md +188 -188
- package/skills/frontend/react-native-expert/references/project-structure.md +171 -171
- package/skills/frontend/react-native-expert/references/storage-hooks.md +173 -173
- package/skills/frontend/senior-frontend/SKILL.md +477 -477
- package/skills/frontend/senior-frontend/references/frontend_best_practices.md +806 -806
- package/skills/frontend/senior-frontend/references/nextjs_optimization_guide.md +724 -724
- package/skills/frontend/senior-frontend/references/react_patterns.md +746 -746
- package/skills/frontend/senior-frontend/scripts/bundle_analyzer.py +407 -407
- package/skills/frontend/senior-frontend/scripts/component_generator.py +329 -329
- package/skills/frontend/senior-frontend/scripts/frontend_scaffolder.py +1005 -1005
- package/skills/frontend/ui-ux-pro-max/SKILL.md +386 -386
- package/skills/frontend/ui-ux-pro-max/data/charts.csv +26 -26
- package/skills/frontend/ui-ux-pro-max/data/colors.csv +97 -97
- package/skills/frontend/ui-ux-pro-max/data/icons.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/landing.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/data/products.csv +96 -96
- package/skills/frontend/ui-ux-pro-max/data/react-performance.csv +45 -45
- package/skills/frontend/ui-ux-pro-max/data/stacks/astro.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
- package/skills/frontend/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
- package/skills/frontend/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
- package/skills/frontend/ui-ux-pro-max/data/stacks/react.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
- package/skills/frontend/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
- package/skills/frontend/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
- package/skills/frontend/ui-ux-pro-max/data/stacks/vue.csv +50 -50
- package/skills/frontend/ui-ux-pro-max/data/styles.csv +68 -68
- package/skills/frontend/ui-ux-pro-max/data/typography.csv +57 -57
- package/skills/frontend/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
- package/skills/frontend/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
- package/skills/frontend/ui-ux-pro-max/data/web-interface.csv +31 -31
- package/skills/frontend/ui-ux-pro-max/scripts/core.py +253 -253
- package/skills/frontend/ui-ux-pro-max/scripts/design_system.py +1067 -1067
- package/skills/frontend/ui-ux-pro-max/scripts/search.py +114 -114
- package/skills/frontend/vue-expert/SKILL.md +98 -98
- package/skills/frontend/vue-expert/references/build-tooling.md +480 -480
- package/skills/frontend/vue-expert/references/components.md +448 -448
- package/skills/frontend/vue-expert/references/composition-api.md +299 -299
- package/skills/frontend/vue-expert/references/mobile-hybrid.md +636 -636
- package/skills/frontend/vue-expert/references/nuxt.md +669 -669
- package/skills/frontend/vue-expert/references/state-management.md +449 -449
- package/skills/frontend/vue-expert/references/typescript.md +584 -584
- package/skills/frontend/vue-expert-js/SKILL.md +167 -167
- package/skills/frontend/vue-expert-js/references/component-architecture.md +219 -219
- package/skills/frontend/vue-expert-js/references/composables-patterns.md +183 -183
- package/skills/frontend/vue-expert-js/references/jsdoc-typing.md +535 -535
- package/skills/frontend/vue-expert-js/references/state-management.md +249 -249
- package/skills/frontend/vue-expert-js/references/testing-patterns.md +237 -237
- package/skills/go-rust-cpp/cpp-pro/SKILL.md +115 -115
- package/skills/go-rust-cpp/cpp-pro/references/build-tooling.md +440 -440
- package/skills/go-rust-cpp/cpp-pro/references/concurrency.md +437 -437
- package/skills/go-rust-cpp/cpp-pro/references/memory-performance.md +397 -397
- package/skills/go-rust-cpp/cpp-pro/references/modern-cpp.md +304 -304
- package/skills/go-rust-cpp/cpp-pro/references/templates.md +357 -357
- package/skills/go-rust-cpp/golang-pro/SKILL.md +122 -122
- package/skills/go-rust-cpp/golang-pro/references/concurrency.md +329 -329
- package/skills/go-rust-cpp/golang-pro/references/generics.md +442 -442
- package/skills/go-rust-cpp/golang-pro/references/interfaces.md +432 -432
- package/skills/go-rust-cpp/golang-pro/references/project-structure.md +477 -477
- package/skills/go-rust-cpp/golang-pro/references/testing.md +451 -451
- package/skills/go-rust-cpp/rust-engineer/SKILL.md +167 -167
- package/skills/go-rust-cpp/rust-engineer/references/async.md +458 -458
- package/skills/go-rust-cpp/rust-engineer/references/error-handling.md +334 -334
- package/skills/go-rust-cpp/rust-engineer/references/ownership.md +278 -278
- package/skills/go-rust-cpp/rust-engineer/references/testing.md +470 -470
- package/skills/go-rust-cpp/rust-engineer/references/traits.md +413 -413
- package/skills/infra/cli-developer/SKILL.md +113 -113
- package/skills/infra/cli-developer/references/design-patterns.md +221 -221
- package/skills/infra/cli-developer/references/go-cli.md +540 -540
- package/skills/infra/cli-developer/references/node-cli.md +383 -383
- package/skills/infra/cli-developer/references/python-cli.md +422 -422
- package/skills/infra/cli-developer/references/ux-patterns.md +448 -448
- package/skills/infra/cloud-architect/SKILL.md +216 -216
- package/skills/infra/cloud-architect/references/aws.md +394 -394
- package/skills/infra/cloud-architect/references/azure.md +562 -562
- package/skills/infra/cloud-architect/references/cost.md +582 -582
- package/skills/infra/cloud-architect/references/gcp.md +633 -633
- package/skills/infra/cloud-architect/references/multi-cloud.md +483 -483
- package/skills/infra/devops-engineer/SKILL.md +144 -144
- package/skills/infra/devops-engineer/references/deployment-strategies.md +241 -241
- package/skills/infra/devops-engineer/references/docker-patterns.md +113 -113
- package/skills/infra/devops-engineer/references/github-actions.md +139 -139
- package/skills/infra/devops-engineer/references/incident-response.md +331 -331
- package/skills/infra/devops-engineer/references/kubernetes.md +154 -154
- package/skills/infra/devops-engineer/references/platform-engineering.md +417 -417
- package/skills/infra/devops-engineer/references/release-automation.md +527 -527
- package/skills/infra/devops-engineer/references/terraform-iac.md +141 -141
- package/skills/infra/kubernetes-specialist/SKILL.md +241 -241
- package/skills/infra/kubernetes-specialist/references/configuration.md +452 -452
- package/skills/infra/kubernetes-specialist/references/cost-optimization.md +458 -458
- package/skills/infra/kubernetes-specialist/references/custom-operators.md +563 -563
- package/skills/infra/kubernetes-specialist/references/gitops.md +530 -530
- package/skills/infra/kubernetes-specialist/references/helm-charts.md +912 -912
- package/skills/infra/kubernetes-specialist/references/multi-cluster.md +507 -507
- package/skills/infra/kubernetes-specialist/references/networking.md +447 -447
- package/skills/infra/kubernetes-specialist/references/service-mesh.md +459 -459
- package/skills/infra/kubernetes-specialist/references/storage.md +535 -535
- package/skills/infra/kubernetes-specialist/references/troubleshooting.md +414 -414
- package/skills/infra/kubernetes-specialist/references/workloads.md +377 -377
- package/skills/infra/mcp-developer/SKILL.md +143 -143
- package/skills/infra/mcp-developer/references/protocol.md +244 -244
- package/skills/infra/mcp-developer/references/python-sdk.md +367 -367
- package/skills/infra/mcp-developer/references/resources.md +554 -554
- package/skills/infra/mcp-developer/references/tools.md +480 -480
- package/skills/infra/mcp-developer/references/typescript-sdk.md +350 -350
- package/skills/infra/monitoring-expert/SKILL.md +176 -176
- package/skills/infra/monitoring-expert/references/alerting-rules.md +141 -141
- package/skills/infra/monitoring-expert/references/application-profiling.md +331 -331
- package/skills/infra/monitoring-expert/references/capacity-planning.md +344 -344
- package/skills/infra/monitoring-expert/references/dashboards.md +126 -126
- package/skills/infra/monitoring-expert/references/opentelemetry.md +123 -123
- package/skills/infra/monitoring-expert/references/performance-testing.md +269 -269
- package/skills/infra/monitoring-expert/references/prometheus-metrics.md +136 -136
- package/skills/infra/monitoring-expert/references/structured-logging.md +142 -142
- package/skills/infra/sre-engineer/SKILL.md +181 -181
- package/skills/infra/sre-engineer/references/automation-toil.md +492 -492
- package/skills/infra/sre-engineer/references/error-budget-policy.md +334 -334
- package/skills/infra/sre-engineer/references/incident-chaos.md +576 -576
- package/skills/infra/sre-engineer/references/monitoring-alerting.md +424 -424
- package/skills/infra/sre-engineer/references/slo-sli-management.md +238 -238
- package/skills/infra/terraform-engineer/SKILL.md +143 -143
- package/skills/infra/terraform-engineer/references/best-practices.md +583 -583
- package/skills/infra/terraform-engineer/references/module-patterns.md +297 -297
- package/skills/infra/terraform-engineer/references/providers.md +452 -452
- package/skills/infra/terraform-engineer/references/state-management.md +371 -371
- package/skills/infra/terraform-engineer/references/testing.md +486 -486
- package/skills/infra/websocket-engineer/SKILL.md +168 -168
- package/skills/infra/websocket-engineer/references/alternatives.md +391 -391
- package/skills/infra/websocket-engineer/references/patterns.md +400 -400
- package/skills/infra/websocket-engineer/references/protocol.md +195 -195
- package/skills/infra/websocket-engineer/references/scaling.md +333 -333
- package/skills/infra/websocket-engineer/references/security.md +474 -474
- package/skills/java/java-architect/SKILL.md +132 -132
- package/skills/java/java-architect/references/jpa-optimization.md +393 -393
- package/skills/java/java-architect/references/reactive-webflux.md +356 -356
- package/skills/java/java-architect/references/spring-boot-setup.md +269 -269
- package/skills/java/java-architect/references/spring-security.md +445 -445
- package/skills/java/java-architect/references/testing-patterns.md +500 -500
- package/skills/java/kotlin-specialist/SKILL.md +147 -147
- package/skills/java/kotlin-specialist/references/android-compose.md +419 -419
- package/skills/java/kotlin-specialist/references/coroutines-flow.md +276 -276
- package/skills/java/kotlin-specialist/references/dsl-idioms.md +421 -421
- package/skills/java/kotlin-specialist/references/ktor-server.md +426 -426
- package/skills/java/kotlin-specialist/references/multiplatform-kmp.md +380 -380
- package/skills/java/spring-boot-engineer/SKILL.md +195 -195
- package/skills/java/spring-boot-engineer/references/cloud.md +498 -498
- package/skills/java/spring-boot-engineer/references/data.md +381 -381
- package/skills/java/spring-boot-engineer/references/security.md +459 -459
- package/skills/java/spring-boot-engineer/references/testing.md +545 -545
- package/skills/java/spring-boot-engineer/references/web.md +295 -295
- package/skills/javascript/javascript-pro/SKILL.md +132 -132
- package/skills/javascript/javascript-pro/references/async-patterns.md +334 -334
- package/skills/javascript/javascript-pro/references/browser-apis.md +398 -398
- package/skills/javascript/javascript-pro/references/modern-syntax.md +272 -272
- package/skills/javascript/javascript-pro/references/modules.md +357 -357
- package/skills/javascript/javascript-pro/references/node-essentials.md +471 -471
- package/skills/javascript/nestjs-expert/SKILL.md +206 -206
- package/skills/javascript/nestjs-expert/references/authentication.md +166 -166
- package/skills/javascript/nestjs-expert/references/controllers-routing.md +111 -111
- package/skills/javascript/nestjs-expert/references/dtos-validation.md +153 -153
- package/skills/javascript/nestjs-expert/references/migration-from-express.md +1237 -1237
- package/skills/javascript/nestjs-expert/references/services-di.md +140 -140
- package/skills/javascript/nestjs-expert/references/testing-patterns.md +186 -186
- package/skills/javascript/typescript-pro/SKILL.md +145 -145
- package/skills/javascript/typescript-pro/references/advanced-types.md +259 -259
- package/skills/javascript/typescript-pro/references/configuration.md +445 -445
- package/skills/javascript/typescript-pro/references/patterns.md +484 -484
- package/skills/javascript/typescript-pro/references/type-guards.md +352 -352
- package/skills/javascript/typescript-pro/references/utility-types.md +329 -329
- package/skills/php/laravel-specialist/SKILL.md +262 -262
- package/skills/php/laravel-specialist/references/eloquent.md +351 -351
- package/skills/php/laravel-specialist/references/livewire.md +512 -512
- package/skills/php/laravel-specialist/references/queues.md +423 -423
- package/skills/php/laravel-specialist/references/routing.md +362 -362
- package/skills/php/laravel-specialist/references/testing.md +522 -522
- package/skills/php/php-pro/SKILL.md +206 -206
- package/skills/php/php-pro/references/async-patterns.md +412 -412
- package/skills/php/php-pro/references/laravel-patterns.md +377 -377
- package/skills/php/php-pro/references/modern-php-features.md +323 -323
- package/skills/php/php-pro/references/symfony-patterns.md +466 -466
- package/skills/php/php-pro/references/testing-quality.md +466 -466
- package/skills/product/competitive-analysis/SKILL.md +257 -257
- package/skills/product/meeting-notes/SKILL.md +266 -266
- package/skills/product/prd-template/SKILL.md +150 -150
- package/skills/product/stakeholder-update/SKILL.md +225 -225
- package/skills/product/user-research-synthesis/SKILL.md +235 -235
- package/skills/python/django-expert/SKILL.md +162 -162
- package/skills/python/django-expert/references/authentication.md +145 -145
- package/skills/python/django-expert/references/drf-serializers.md +148 -148
- package/skills/python/django-expert/references/models-orm.md +151 -151
- package/skills/python/django-expert/references/testing-django.md +204 -204
- package/skills/python/django-expert/references/viewsets-views.md +153 -153
- package/skills/python/fastapi-expert/SKILL.md +185 -185
- package/skills/python/fastapi-expert/references/async-sqlalchemy.md +146 -146
- package/skills/python/fastapi-expert/references/authentication.md +159 -159
- package/skills/python/fastapi-expert/references/endpoints-routing.md +142 -142
- package/skills/python/fastapi-expert/references/migration-from-django.md +996 -996
- package/skills/python/fastapi-expert/references/pydantic-v2.md +135 -135
- package/skills/python/fastapi-expert/references/testing-async.md +159 -159
- package/skills/python/pandas-pro/SKILL.md +178 -178
- package/skills/python/pandas-pro/references/aggregation-groupby.md +545 -545
- package/skills/python/pandas-pro/references/data-cleaning.md +500 -500
- package/skills/python/pandas-pro/references/dataframe-operations.md +420 -420
- package/skills/python/pandas-pro/references/merging-joining.md +596 -596
- package/skills/python/pandas-pro/references/performance-optimization.md +597 -597
- package/skills/python/python-pro/SKILL.md +177 -177
- package/skills/python/python-pro/references/async-patterns.md +356 -356
- package/skills/python/python-pro/references/packaging.md +460 -460
- package/skills/python/python-pro/references/standard-library.md +378 -378
- package/skills/python/python-pro/references/testing.md +404 -404
- package/skills/python/python-pro/references/type-system.md +290 -290
- package/skills/quality/chaos-engineer/SKILL.md +182 -182
- package/skills/quality/chaos-engineer/references/chaos-tools.md +511 -511
- package/skills/quality/chaos-engineer/references/experiment-design.md +229 -229
- package/skills/quality/chaos-engineer/references/game-days.md +434 -434
- package/skills/quality/chaos-engineer/references/infrastructure-chaos.md +348 -348
- package/skills/quality/chaos-engineer/references/kubernetes-chaos.md +432 -432
- package/skills/quality/code-reviewer/SKILL.md +119 -119
- package/skills/quality/code-reviewer/references/common-issues.md +142 -142
- package/skills/quality/code-reviewer/references/feedback-examples.md +144 -144
- package/skills/quality/code-reviewer/references/receiving-feedback.md +238 -238
- package/skills/quality/code-reviewer/references/report-template.md +109 -109
- package/skills/quality/code-reviewer/references/review-checklist.md +88 -88
- package/skills/quality/code-reviewer/references/spec-compliance-review.md +258 -258
- package/skills/quality/playwright-expert/SKILL.md +169 -169
- package/skills/quality/playwright-expert/references/api-mocking.md +140 -140
- package/skills/quality/playwright-expert/references/configuration.md +155 -155
- package/skills/quality/playwright-expert/references/debugging-flaky.md +150 -150
- package/skills/quality/playwright-expert/references/page-object-model.md +152 -152
- package/skills/quality/playwright-expert/references/selectors-locators.md +119 -119
- package/skills/quality/secure-code-guardian/SKILL.md +191 -191
- package/skills/quality/secure-code-guardian/references/authentication.md +136 -136
- package/skills/quality/secure-code-guardian/references/input-validation.md +146 -146
- package/skills/quality/secure-code-guardian/references/owasp-prevention.md +135 -135
- package/skills/quality/secure-code-guardian/references/security-headers.md +133 -133
- package/skills/quality/secure-code-guardian/references/xss-csrf.md +157 -157
- package/skills/quality/security-reviewer/SKILL.md +103 -103
- package/skills/quality/security-reviewer/references/infrastructure-security.md +268 -268
- package/skills/quality/security-reviewer/references/penetration-testing.md +268 -268
- package/skills/quality/security-reviewer/references/report-template.md +170 -170
- package/skills/quality/security-reviewer/references/sast-tools.md +117 -117
- package/skills/quality/security-reviewer/references/secret-scanning.md +125 -125
- package/skills/quality/security-reviewer/references/vulnerability-patterns.md +152 -152
- package/skills/quality/senior-qa/README.md +196 -196
- package/skills/quality/senior-qa/SKILL.md +399 -399
- package/skills/quality/senior-qa/references/qa_best_practices.md +964 -964
- package/skills/quality/senior-qa/references/test_automation_patterns.md +1009 -1009
- package/skills/quality/senior-qa/references/testing_strategies.md +649 -649
- package/skills/quality/senior-qa/scripts/coverage_analyzer.py +836 -836
- package/skills/quality/senior-qa/scripts/e2e_test_scaffolder.py +820 -820
- package/skills/quality/senior-qa/scripts/test_suite_generator.py +605 -605
- package/skills/quality/tdd-guide/HOW_TO_USE.md +313 -313
- package/skills/quality/tdd-guide/README.md +680 -680
- package/skills/quality/tdd-guide/SKILL.md +122 -122
- package/skills/quality/tdd-guide/assets/expected_output.json +77 -77
- package/skills/quality/tdd-guide/assets/sample_input_python.json +39 -39
- package/skills/quality/tdd-guide/assets/sample_input_typescript.json +36 -36
- package/skills/quality/tdd-guide/references/ci-integration.md +195 -195
- package/skills/quality/tdd-guide/references/framework-guide.md +206 -206
- package/skills/quality/tdd-guide/references/tdd-best-practices.md +128 -128
- package/skills/quality/tdd-guide/scripts/coverage_analyzer.py +434 -434
- package/skills/quality/tdd-guide/scripts/fixture_generator.py +440 -440
- package/skills/quality/tdd-guide/scripts/format_detector.py +384 -384
- package/skills/quality/tdd-guide/scripts/framework_adapter.py +428 -428
- package/skills/quality/tdd-guide/scripts/metrics_calculator.py +456 -456
- package/skills/quality/tdd-guide/scripts/output_formatter.py +354 -354
- package/skills/quality/tdd-guide/scripts/tdd_workflow.py +474 -474
- package/skills/quality/tdd-guide/scripts/test_generator.py +438 -438
- package/skills/quality/test-master/SKILL.md +94 -94
- package/skills/quality/test-master/references/automation-frameworks.md +294 -294
- package/skills/quality/test-master/references/e2e-testing.md +128 -128
- package/skills/quality/test-master/references/integration-testing.md +120 -120
- package/skills/quality/test-master/references/performance-testing.md +118 -118
- package/skills/quality/test-master/references/qa-methodology.md +247 -247
- package/skills/quality/test-master/references/security-testing.md +127 -127
- package/skills/quality/test-master/references/tdd-iron-laws.md +174 -174
- package/skills/quality/test-master/references/test-reports.md +104 -104
- package/skills/quality/test-master/references/testing-anti-patterns.md +231 -231
- package/skills/quality/test-master/references/unit-testing.md +113 -113
- package/skills/ruby/rails-expert/SKILL.md +154 -154
- package/skills/ruby/rails-expert/references/active-record.md +244 -244
- package/skills/ruby/rails-expert/references/api-development.md +401 -401
- package/skills/ruby/rails-expert/references/background-jobs.md +272 -272
- package/skills/ruby/rails-expert/references/hotwire-turbo.md +228 -228
- package/skills/ruby/rails-expert/references/rspec-testing.md +367 -367
- package/skills/swift/swift-expert/SKILL.md +163 -163
- package/skills/swift/swift-expert/references/async-concurrency.md +360 -360
- package/skills/swift/swift-expert/references/memory-performance.md +377 -377
- package/skills/swift/swift-expert/references/protocol-oriented.md +354 -354
- package/skills/swift/swift-expert/references/swiftui-patterns.md +291 -291
- package/skills/swift/swift-expert/references/testing-patterns.md +399 -399
- package/skills/workflow/brainstorming/SKILL.md +164 -164
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -214
- package/skills/workflow/brainstorming/scripts/helper.js +88 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -56
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -49
- package/skills/workflow/brainstorming/visual-companion.md +287 -287
- package/skills/workflow/documentation/SKILL.md +45 -45
- package/skills/workflow/entropy-management/SKILL.md +115 -115
- package/skills/workflow/executing-plans/SKILL.md +70 -70
- package/skills/workflow/finishing-a-development-branch/SKILL.md +200 -200
- package/skills/workflow/receiving-code-review/SKILL.md +213 -213
- package/skills/workflow/requesting-code-review/SKILL.md +105 -105
- package/skills/workflow/requesting-code-review/code-reviewer.md +146 -146
- package/skills/workflow/requirement-engineering/SKILL.md +111 -111
- package/skills/workflow/systematic-debugging/CREATION-LOG.md +119 -119
- package/skills/workflow/systematic-debugging/SKILL.md +296 -296
- package/skills/workflow/systematic-debugging/condition-based-waiting-example.ts +158 -158
- package/skills/workflow/systematic-debugging/condition-based-waiting.md +115 -115
- package/skills/workflow/systematic-debugging/defense-in-depth.md +122 -122
- package/skills/workflow/systematic-debugging/find-polluter.sh +63 -63
- package/skills/workflow/systematic-debugging/root-cause-tracing.md +169 -169
- package/skills/workflow/systematic-debugging/test-academic.md +14 -14
- package/skills/workflow/systematic-debugging/test-pressure-1.md +58 -58
- package/skills/workflow/systematic-debugging/test-pressure-2.md +68 -68
- package/skills/workflow/systematic-debugging/test-pressure-3.md +69 -69
- package/skills/workflow/using-git-worktrees/SKILL.md +218 -218
- package/skills/workflow/verification-before-completion/SKILL.md +139 -139
- package/skills/workflow/writing-plans/SKILL.md +151 -151
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -49
- package/skills/workflow/writing-skills/SKILL.md +655 -655
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -189
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -187
- package/skills/workflow/writing-skills/render-graphs.js +168 -168
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -384
|
@@ -1,352 +1,352 @@
|
|
|
1
|
-
# Type Guards and Narrowing
|
|
2
|
-
|
|
3
|
-
## Type Predicates
|
|
4
|
-
|
|
5
|
-
```typescript
|
|
6
|
-
// Basic type predicate
|
|
7
|
-
function isString(value: unknown): value is string {
|
|
8
|
-
return typeof value === 'string';
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function processValue(value: string | number) {
|
|
12
|
-
if (isString(value)) {
|
|
13
|
-
console.log(value.toUpperCase()); // value is string
|
|
14
|
-
} else {
|
|
15
|
-
console.log(value.toFixed(2)); // value is number
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Generic type predicate
|
|
20
|
-
function isArray<T>(value: T | T[]): value is T[] {
|
|
21
|
-
return Array.isArray(value);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Narrowing to specific interface
|
|
25
|
-
interface User {
|
|
26
|
-
type: 'user';
|
|
27
|
-
name: string;
|
|
28
|
-
email: string;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
interface Admin {
|
|
32
|
-
type: 'admin';
|
|
33
|
-
name: string;
|
|
34
|
-
permissions: string[];
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
function isAdmin(account: User | Admin): account is Admin {
|
|
38
|
-
return account.type === 'admin';
|
|
39
|
-
}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## Discriminated Unions
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
// Tagged union pattern
|
|
46
|
-
type Result<T, E = Error> =
|
|
47
|
-
| { status: 'success'; data: T }
|
|
48
|
-
| { status: 'error'; error: E }
|
|
49
|
-
| { status: 'loading' };
|
|
50
|
-
|
|
51
|
-
function handleResult<T>(result: Result<T>) {
|
|
52
|
-
switch (result.status) {
|
|
53
|
-
case 'success':
|
|
54
|
-
console.log(result.data); // Narrowed to success
|
|
55
|
-
break;
|
|
56
|
-
case 'error':
|
|
57
|
-
console.error(result.error); // Narrowed to error
|
|
58
|
-
break;
|
|
59
|
-
case 'loading':
|
|
60
|
-
console.log('Loading...'); // Narrowed to loading
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Complex discriminated union
|
|
66
|
-
type Shape =
|
|
67
|
-
| { kind: 'circle'; radius: number }
|
|
68
|
-
| { kind: 'rectangle'; width: number; height: number }
|
|
69
|
-
| { kind: 'triangle'; base: number; height: number };
|
|
70
|
-
|
|
71
|
-
function getArea(shape: Shape): number {
|
|
72
|
-
switch (shape.kind) {
|
|
73
|
-
case 'circle':
|
|
74
|
-
return Math.PI * shape.radius ** 2;
|
|
75
|
-
case 'rectangle':
|
|
76
|
-
return shape.width * shape.height;
|
|
77
|
-
case 'triangle':
|
|
78
|
-
return (shape.base * shape.height) / 2;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Exhaustive checking
|
|
83
|
-
function assertNever(x: never): never {
|
|
84
|
-
throw new Error('Unexpected value: ' + x);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function processShape(shape: Shape): number {
|
|
88
|
-
switch (shape.kind) {
|
|
89
|
-
case 'circle':
|
|
90
|
-
return shape.radius;
|
|
91
|
-
case 'rectangle':
|
|
92
|
-
return shape.width;
|
|
93
|
-
case 'triangle':
|
|
94
|
-
return shape.base;
|
|
95
|
-
default:
|
|
96
|
-
return assertNever(shape); // Compile error if not exhaustive
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## Built-in Type Guards
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
// typeof narrowing
|
|
105
|
-
function printValue(value: string | number | boolean) {
|
|
106
|
-
if (typeof value === 'string') {
|
|
107
|
-
console.log(value.toUpperCase());
|
|
108
|
-
} else if (typeof value === 'number') {
|
|
109
|
-
console.log(value.toFixed(2));
|
|
110
|
-
} else {
|
|
111
|
-
console.log(value ? 'yes' : 'no');
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// instanceof narrowing
|
|
116
|
-
class Dog {
|
|
117
|
-
bark() { console.log('woof'); }
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
class Cat {
|
|
121
|
-
meow() { console.log('meow'); }
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function makeSound(animal: Dog | Cat) {
|
|
125
|
-
if (animal instanceof Dog) {
|
|
126
|
-
animal.bark();
|
|
127
|
-
} else {
|
|
128
|
-
animal.meow();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// in operator narrowing
|
|
133
|
-
type Fish = { swim: () => void };
|
|
134
|
-
type Bird = { fly: () => void };
|
|
135
|
-
|
|
136
|
-
function move(animal: Fish | Bird) {
|
|
137
|
-
if ('swim' in animal) {
|
|
138
|
-
animal.swim();
|
|
139
|
-
} else {
|
|
140
|
-
animal.fly();
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Truthiness narrowing
|
|
145
|
-
function printLength(value: string | null | undefined) {
|
|
146
|
-
if (value) {
|
|
147
|
-
console.log(value.length); // Narrowed to string
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Equality narrowing
|
|
152
|
-
function compare(x: string | number, y: string | boolean) {
|
|
153
|
-
if (x === y) {
|
|
154
|
-
// x and y are both string
|
|
155
|
-
console.log(x.toUpperCase(), y.toUpperCase());
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
## Assertion Functions
|
|
161
|
-
|
|
162
|
-
```typescript
|
|
163
|
-
// Basic assertion function
|
|
164
|
-
function assert(condition: unknown, message?: string): asserts condition {
|
|
165
|
-
if (!condition) {
|
|
166
|
-
throw new Error(message || 'Assertion failed');
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function processUser(user: unknown) {
|
|
171
|
-
assert(typeof user === 'object' && user !== null);
|
|
172
|
-
assert('name' in user && typeof user.name === 'string');
|
|
173
|
-
console.log(user.name.toUpperCase()); // user is narrowed
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
// Type assertion function
|
|
177
|
-
function assertIsString(value: unknown): asserts value is string {
|
|
178
|
-
if (typeof value !== 'string') {
|
|
179
|
-
throw new Error('Value is not a string');
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function greet(name: unknown) {
|
|
184
|
-
assertIsString(name);
|
|
185
|
-
console.log(`Hello, ${name.toUpperCase()}`); // name is string
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Generic assertion function
|
|
189
|
-
function assertIsDefined<T>(value: T): asserts value is NonNullable<T> {
|
|
190
|
-
if (value === null || value === undefined) {
|
|
191
|
-
throw new Error('Value is null or undefined');
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function processValue(value: string | null) {
|
|
196
|
-
assertIsDefined(value);
|
|
197
|
-
console.log(value.length); // value is string
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Assert with type predicate
|
|
201
|
-
function assertIsUser(value: unknown): asserts value is User {
|
|
202
|
-
if (
|
|
203
|
-
typeof value !== 'object' ||
|
|
204
|
-
value === null ||
|
|
205
|
-
!('type' in value) ||
|
|
206
|
-
value.type !== 'user'
|
|
207
|
-
) {
|
|
208
|
-
throw new Error('Not a user');
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
## Control Flow Analysis
|
|
214
|
-
|
|
215
|
-
```typescript
|
|
216
|
-
// Assignment narrowing
|
|
217
|
-
let x: string | number = Math.random() > 0.5 ? 'hello' : 42;
|
|
218
|
-
|
|
219
|
-
if (typeof x === 'string') {
|
|
220
|
-
x; // string
|
|
221
|
-
} else {
|
|
222
|
-
x; // number
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// Return statement narrowing
|
|
226
|
-
function getValue(flag: boolean): string | number {
|
|
227
|
-
if (flag) {
|
|
228
|
-
return 'hello';
|
|
229
|
-
}
|
|
230
|
-
return 42; // TypeScript knows this must be number
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Throw statement narrowing
|
|
234
|
-
function processValue(value: string | null) {
|
|
235
|
-
if (!value) {
|
|
236
|
-
throw new Error('Value is required');
|
|
237
|
-
}
|
|
238
|
-
console.log(value.length); // value is string (null thrown above)
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Type guards in array methods
|
|
242
|
-
const mixed: (string | number)[] = ['a', 1, 'b', 2];
|
|
243
|
-
const strings = mixed.filter((x): x is string => typeof x === 'string');
|
|
244
|
-
// strings is string[]
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
## Branded Types
|
|
248
|
-
|
|
249
|
-
```typescript
|
|
250
|
-
// Nominal typing with branded types
|
|
251
|
-
type Brand<K, T> = K & { __brand: T };
|
|
252
|
-
|
|
253
|
-
type UserId = Brand<string, 'UserId'>;
|
|
254
|
-
type Email = Brand<string, 'Email'>;
|
|
255
|
-
type Url = Brand<string, 'Url'>;
|
|
256
|
-
|
|
257
|
-
// Constructor functions
|
|
258
|
-
function createUserId(id: string): UserId {
|
|
259
|
-
return id as UserId;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
function createEmail(email: string): Email {
|
|
263
|
-
if (!email.includes('@')) {
|
|
264
|
-
throw new Error('Invalid email');
|
|
265
|
-
}
|
|
266
|
-
return email as Email;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Usage prevents mixing
|
|
270
|
-
const userId: UserId = createUserId('user-123');
|
|
271
|
-
const email: Email = createEmail('user@example.com');
|
|
272
|
-
|
|
273
|
-
// const wrongAssignment: UserId = email; // Error!
|
|
274
|
-
|
|
275
|
-
// Type guard for branded types
|
|
276
|
-
function isUserId(value: string): value is UserId {
|
|
277
|
-
return /^user-\d+$/.test(value);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Branded numbers
|
|
281
|
-
type Positive = Brand<number, 'Positive'>;
|
|
282
|
-
type Integer = Brand<number, 'Integer'>;
|
|
283
|
-
|
|
284
|
-
function createPositive(n: number): Positive {
|
|
285
|
-
if (n <= 0) throw new Error('Must be positive');
|
|
286
|
-
return n as Positive;
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
function createInteger(n: number): Integer {
|
|
290
|
-
if (!Number.isInteger(n)) throw new Error('Must be integer');
|
|
291
|
-
return n as Integer;
|
|
292
|
-
}
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
## Advanced Narrowing Patterns
|
|
296
|
-
|
|
297
|
-
```typescript
|
|
298
|
-
// Array.isArray with generics
|
|
299
|
-
function processInput<T>(input: T | T[]): T[] {
|
|
300
|
-
return Array.isArray(input) ? input : [input];
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// Object key narrowing
|
|
304
|
-
function getProperty<T extends object, K extends keyof T>(
|
|
305
|
-
obj: T,
|
|
306
|
-
key: K
|
|
307
|
-
): T[K] {
|
|
308
|
-
return obj[key];
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// Mapped type narrowing
|
|
312
|
-
type Nullable<T> = { [K in keyof T]: T[K] | null };
|
|
313
|
-
|
|
314
|
-
function isComplete<T extends object>(
|
|
315
|
-
obj: Nullable<T>
|
|
316
|
-
): obj is T {
|
|
317
|
-
return Object.values(obj).every((v) => v !== null);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Custom narrowing with type maps
|
|
321
|
-
type TypeMap = {
|
|
322
|
-
string: string;
|
|
323
|
-
number: number;
|
|
324
|
-
boolean: boolean;
|
|
325
|
-
};
|
|
326
|
-
|
|
327
|
-
function is<K extends keyof TypeMap>(
|
|
328
|
-
type: K,
|
|
329
|
-
value: unknown
|
|
330
|
-
): value is TypeMap[K] {
|
|
331
|
-
return typeof value === type;
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
if (is('string', someValue)) {
|
|
335
|
-
someValue.toUpperCase(); // someValue is string
|
|
336
|
-
}
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
## Quick Reference
|
|
340
|
-
|
|
341
|
-
| Pattern | Use Case |
|
|
342
|
-
|---------|----------|
|
|
343
|
-
| `value is Type` | Type predicate function |
|
|
344
|
-
| `asserts condition` | Assertion function |
|
|
345
|
-
| `asserts value is Type` | Type assertion function |
|
|
346
|
-
| Discriminated union | Tagged union with literal type |
|
|
347
|
-
| `typeof` guard | Primitive type checking |
|
|
348
|
-
| `instanceof` guard | Class instance checking |
|
|
349
|
-
| `in` operator | Property existence check |
|
|
350
|
-
| `assertNever` | Exhaustive switch checking |
|
|
351
|
-
| Branded types | Nominal typing simulation |
|
|
352
|
-
| `NonNullable<T>` | Remove null/undefined |
|
|
1
|
+
# Type Guards and Narrowing
|
|
2
|
+
|
|
3
|
+
## Type Predicates
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Basic type predicate
|
|
7
|
+
function isString(value: unknown): value is string {
|
|
8
|
+
return typeof value === 'string';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function processValue(value: string | number) {
|
|
12
|
+
if (isString(value)) {
|
|
13
|
+
console.log(value.toUpperCase()); // value is string
|
|
14
|
+
} else {
|
|
15
|
+
console.log(value.toFixed(2)); // value is number
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Generic type predicate
|
|
20
|
+
function isArray<T>(value: T | T[]): value is T[] {
|
|
21
|
+
return Array.isArray(value);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Narrowing to specific interface
|
|
25
|
+
interface User {
|
|
26
|
+
type: 'user';
|
|
27
|
+
name: string;
|
|
28
|
+
email: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface Admin {
|
|
32
|
+
type: 'admin';
|
|
33
|
+
name: string;
|
|
34
|
+
permissions: string[];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function isAdmin(account: User | Admin): account is Admin {
|
|
38
|
+
return account.type === 'admin';
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Discriminated Unions
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// Tagged union pattern
|
|
46
|
+
type Result<T, E = Error> =
|
|
47
|
+
| { status: 'success'; data: T }
|
|
48
|
+
| { status: 'error'; error: E }
|
|
49
|
+
| { status: 'loading' };
|
|
50
|
+
|
|
51
|
+
function handleResult<T>(result: Result<T>) {
|
|
52
|
+
switch (result.status) {
|
|
53
|
+
case 'success':
|
|
54
|
+
console.log(result.data); // Narrowed to success
|
|
55
|
+
break;
|
|
56
|
+
case 'error':
|
|
57
|
+
console.error(result.error); // Narrowed to error
|
|
58
|
+
break;
|
|
59
|
+
case 'loading':
|
|
60
|
+
console.log('Loading...'); // Narrowed to loading
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Complex discriminated union
|
|
66
|
+
type Shape =
|
|
67
|
+
| { kind: 'circle'; radius: number }
|
|
68
|
+
| { kind: 'rectangle'; width: number; height: number }
|
|
69
|
+
| { kind: 'triangle'; base: number; height: number };
|
|
70
|
+
|
|
71
|
+
function getArea(shape: Shape): number {
|
|
72
|
+
switch (shape.kind) {
|
|
73
|
+
case 'circle':
|
|
74
|
+
return Math.PI * shape.radius ** 2;
|
|
75
|
+
case 'rectangle':
|
|
76
|
+
return shape.width * shape.height;
|
|
77
|
+
case 'triangle':
|
|
78
|
+
return (shape.base * shape.height) / 2;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Exhaustive checking
|
|
83
|
+
function assertNever(x: never): never {
|
|
84
|
+
throw new Error('Unexpected value: ' + x);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function processShape(shape: Shape): number {
|
|
88
|
+
switch (shape.kind) {
|
|
89
|
+
case 'circle':
|
|
90
|
+
return shape.radius;
|
|
91
|
+
case 'rectangle':
|
|
92
|
+
return shape.width;
|
|
93
|
+
case 'triangle':
|
|
94
|
+
return shape.base;
|
|
95
|
+
default:
|
|
96
|
+
return assertNever(shape); // Compile error if not exhaustive
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Built-in Type Guards
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// typeof narrowing
|
|
105
|
+
function printValue(value: string | number | boolean) {
|
|
106
|
+
if (typeof value === 'string') {
|
|
107
|
+
console.log(value.toUpperCase());
|
|
108
|
+
} else if (typeof value === 'number') {
|
|
109
|
+
console.log(value.toFixed(2));
|
|
110
|
+
} else {
|
|
111
|
+
console.log(value ? 'yes' : 'no');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// instanceof narrowing
|
|
116
|
+
class Dog {
|
|
117
|
+
bark() { console.log('woof'); }
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
class Cat {
|
|
121
|
+
meow() { console.log('meow'); }
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function makeSound(animal: Dog | Cat) {
|
|
125
|
+
if (animal instanceof Dog) {
|
|
126
|
+
animal.bark();
|
|
127
|
+
} else {
|
|
128
|
+
animal.meow();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// in operator narrowing
|
|
133
|
+
type Fish = { swim: () => void };
|
|
134
|
+
type Bird = { fly: () => void };
|
|
135
|
+
|
|
136
|
+
function move(animal: Fish | Bird) {
|
|
137
|
+
if ('swim' in animal) {
|
|
138
|
+
animal.swim();
|
|
139
|
+
} else {
|
|
140
|
+
animal.fly();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Truthiness narrowing
|
|
145
|
+
function printLength(value: string | null | undefined) {
|
|
146
|
+
if (value) {
|
|
147
|
+
console.log(value.length); // Narrowed to string
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Equality narrowing
|
|
152
|
+
function compare(x: string | number, y: string | boolean) {
|
|
153
|
+
if (x === y) {
|
|
154
|
+
// x and y are both string
|
|
155
|
+
console.log(x.toUpperCase(), y.toUpperCase());
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Assertion Functions
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
// Basic assertion function
|
|
164
|
+
function assert(condition: unknown, message?: string): asserts condition {
|
|
165
|
+
if (!condition) {
|
|
166
|
+
throw new Error(message || 'Assertion failed');
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function processUser(user: unknown) {
|
|
171
|
+
assert(typeof user === 'object' && user !== null);
|
|
172
|
+
assert('name' in user && typeof user.name === 'string');
|
|
173
|
+
console.log(user.name.toUpperCase()); // user is narrowed
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Type assertion function
|
|
177
|
+
function assertIsString(value: unknown): asserts value is string {
|
|
178
|
+
if (typeof value !== 'string') {
|
|
179
|
+
throw new Error('Value is not a string');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function greet(name: unknown) {
|
|
184
|
+
assertIsString(name);
|
|
185
|
+
console.log(`Hello, ${name.toUpperCase()}`); // name is string
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Generic assertion function
|
|
189
|
+
function assertIsDefined<T>(value: T): asserts value is NonNullable<T> {
|
|
190
|
+
if (value === null || value === undefined) {
|
|
191
|
+
throw new Error('Value is null or undefined');
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function processValue(value: string | null) {
|
|
196
|
+
assertIsDefined(value);
|
|
197
|
+
console.log(value.length); // value is string
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Assert with type predicate
|
|
201
|
+
function assertIsUser(value: unknown): asserts value is User {
|
|
202
|
+
if (
|
|
203
|
+
typeof value !== 'object' ||
|
|
204
|
+
value === null ||
|
|
205
|
+
!('type' in value) ||
|
|
206
|
+
value.type !== 'user'
|
|
207
|
+
) {
|
|
208
|
+
throw new Error('Not a user');
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Control Flow Analysis
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
// Assignment narrowing
|
|
217
|
+
let x: string | number = Math.random() > 0.5 ? 'hello' : 42;
|
|
218
|
+
|
|
219
|
+
if (typeof x === 'string') {
|
|
220
|
+
x; // string
|
|
221
|
+
} else {
|
|
222
|
+
x; // number
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// Return statement narrowing
|
|
226
|
+
function getValue(flag: boolean): string | number {
|
|
227
|
+
if (flag) {
|
|
228
|
+
return 'hello';
|
|
229
|
+
}
|
|
230
|
+
return 42; // TypeScript knows this must be number
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Throw statement narrowing
|
|
234
|
+
function processValue(value: string | null) {
|
|
235
|
+
if (!value) {
|
|
236
|
+
throw new Error('Value is required');
|
|
237
|
+
}
|
|
238
|
+
console.log(value.length); // value is string (null thrown above)
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Type guards in array methods
|
|
242
|
+
const mixed: (string | number)[] = ['a', 1, 'b', 2];
|
|
243
|
+
const strings = mixed.filter((x): x is string => typeof x === 'string');
|
|
244
|
+
// strings is string[]
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Branded Types
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
// Nominal typing with branded types
|
|
251
|
+
type Brand<K, T> = K & { __brand: T };
|
|
252
|
+
|
|
253
|
+
type UserId = Brand<string, 'UserId'>;
|
|
254
|
+
type Email = Brand<string, 'Email'>;
|
|
255
|
+
type Url = Brand<string, 'Url'>;
|
|
256
|
+
|
|
257
|
+
// Constructor functions
|
|
258
|
+
function createUserId(id: string): UserId {
|
|
259
|
+
return id as UserId;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function createEmail(email: string): Email {
|
|
263
|
+
if (!email.includes('@')) {
|
|
264
|
+
throw new Error('Invalid email');
|
|
265
|
+
}
|
|
266
|
+
return email as Email;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Usage prevents mixing
|
|
270
|
+
const userId: UserId = createUserId('user-123');
|
|
271
|
+
const email: Email = createEmail('user@example.com');
|
|
272
|
+
|
|
273
|
+
// const wrongAssignment: UserId = email; // Error!
|
|
274
|
+
|
|
275
|
+
// Type guard for branded types
|
|
276
|
+
function isUserId(value: string): value is UserId {
|
|
277
|
+
return /^user-\d+$/.test(value);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Branded numbers
|
|
281
|
+
type Positive = Brand<number, 'Positive'>;
|
|
282
|
+
type Integer = Brand<number, 'Integer'>;
|
|
283
|
+
|
|
284
|
+
function createPositive(n: number): Positive {
|
|
285
|
+
if (n <= 0) throw new Error('Must be positive');
|
|
286
|
+
return n as Positive;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function createInteger(n: number): Integer {
|
|
290
|
+
if (!Number.isInteger(n)) throw new Error('Must be integer');
|
|
291
|
+
return n as Integer;
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Advanced Narrowing Patterns
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
// Array.isArray with generics
|
|
299
|
+
function processInput<T>(input: T | T[]): T[] {
|
|
300
|
+
return Array.isArray(input) ? input : [input];
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Object key narrowing
|
|
304
|
+
function getProperty<T extends object, K extends keyof T>(
|
|
305
|
+
obj: T,
|
|
306
|
+
key: K
|
|
307
|
+
): T[K] {
|
|
308
|
+
return obj[key];
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Mapped type narrowing
|
|
312
|
+
type Nullable<T> = { [K in keyof T]: T[K] | null };
|
|
313
|
+
|
|
314
|
+
function isComplete<T extends object>(
|
|
315
|
+
obj: Nullable<T>
|
|
316
|
+
): obj is T {
|
|
317
|
+
return Object.values(obj).every((v) => v !== null);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Custom narrowing with type maps
|
|
321
|
+
type TypeMap = {
|
|
322
|
+
string: string;
|
|
323
|
+
number: number;
|
|
324
|
+
boolean: boolean;
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
function is<K extends keyof TypeMap>(
|
|
328
|
+
type: K,
|
|
329
|
+
value: unknown
|
|
330
|
+
): value is TypeMap[K] {
|
|
331
|
+
return typeof value === type;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (is('string', someValue)) {
|
|
335
|
+
someValue.toUpperCase(); // someValue is string
|
|
336
|
+
}
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Quick Reference
|
|
340
|
+
|
|
341
|
+
| Pattern | Use Case |
|
|
342
|
+
|---------|----------|
|
|
343
|
+
| `value is Type` | Type predicate function |
|
|
344
|
+
| `asserts condition` | Assertion function |
|
|
345
|
+
| `asserts value is Type` | Type assertion function |
|
|
346
|
+
| Discriminated union | Tagged union with literal type |
|
|
347
|
+
| `typeof` guard | Primitive type checking |
|
|
348
|
+
| `instanceof` guard | Class instance checking |
|
|
349
|
+
| `in` operator | Property existence check |
|
|
350
|
+
| `assertNever` | Exhaustive switch checking |
|
|
351
|
+
| Branded types | Nominal typing simulation |
|
|
352
|
+
| `NonNullable<T>` | Remove null/undefined |
|