@biggora/claude-plugins 1.2.0 → 1.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 +13 -4
- package/package.json +1 -1
- package/registry/registry.json +334 -244
- package/specs/coding.md +30 -0
- package/specs/pod.md +2 -0
- package/src/commands/skills/add.js +63 -7
- package/src/commands/skills/list.js +23 -52
- package/src/commands/skills/remove.js +26 -27
- package/src/commands/skills/resolve.js +155 -0
- package/src/commands/skills/update.js +58 -74
- package/src/skills/captcha/README.md +221 -0
- package/src/skills/captcha/SKILL.md +355 -0
- package/src/skills/captcha/references/captcha-types.md +254 -0
- package/src/skills/captcha/references/services.md +172 -0
- package/src/skills/captcha/references/stealth.md +238 -0
- package/src/skills/captcha/scripts/solve_captcha.py +323 -0
- package/src/skills/captcha/scripts/solve_image_grid.py +350 -0
- package/src/skills/google-merchant-api/SKILL.md +581 -0
- package/src/skills/google-merchant-api/references/accounts.md +247 -0
- package/src/skills/google-merchant-api/references/content-api-legacy.md +216 -0
- package/src/skills/google-merchant-api/references/datasources.md +233 -0
- package/src/skills/google-merchant-api/references/inventories.md +201 -0
- package/src/skills/google-merchant-api/references/migration.md +267 -0
- package/src/skills/google-merchant-api/references/products.md +316 -0
- package/src/skills/google-merchant-api/references/promotions.md +201 -0
- package/src/skills/google-merchant-api/references/reports.md +240 -0
- package/src/skills/lv-aggregators-api/SKILL.md +113 -0
- package/src/skills/lv-aggregators-api/references/integration-guide.md +368 -0
- package/src/skills/lv-aggregators-api/references/kurpirkt.md +103 -0
- package/src/skills/lv-aggregators-api/references/salidzini.md +122 -0
- package/src/skills/nest-best-practices/SKILL.md +251 -0
- package/src/skills/nest-best-practices/references/best-practices-request-lifecycle.md +158 -0
- package/src/skills/nest-best-practices/references/cli-monorepo.md +106 -0
- package/src/skills/nest-best-practices/references/cli-overview.md +157 -0
- package/src/skills/nest-best-practices/references/core-controllers.md +165 -0
- package/src/skills/nest-best-practices/references/core-dependency-injection.md +179 -0
- package/src/skills/nest-best-practices/references/core-middleware.md +139 -0
- package/src/skills/nest-best-practices/references/core-modules.md +138 -0
- package/src/skills/nest-best-practices/references/core-providers.md +188 -0
- package/src/skills/nest-best-practices/references/faq-raw-body-hybrid.md +122 -0
- package/src/skills/nest-best-practices/references/fundamentals-circular-dependency.md +89 -0
- package/src/skills/nest-best-practices/references/fundamentals-custom-decorators.md +107 -0
- package/src/skills/nest-best-practices/references/fundamentals-dynamic-modules.md +125 -0
- package/src/skills/nest-best-practices/references/fundamentals-exception-filters.md +202 -0
- package/src/skills/nest-best-practices/references/fundamentals-execution-context.md +107 -0
- package/src/skills/nest-best-practices/references/fundamentals-guards.md +136 -0
- package/src/skills/nest-best-practices/references/fundamentals-interceptors.md +187 -0
- package/src/skills/nest-best-practices/references/fundamentals-lazy-loading.md +89 -0
- package/src/skills/nest-best-practices/references/fundamentals-lifecycle-events.md +87 -0
- package/src/skills/nest-best-practices/references/fundamentals-module-reference.md +107 -0
- package/src/skills/nest-best-practices/references/fundamentals-pipes.md +197 -0
- package/src/skills/nest-best-practices/references/fundamentals-provider-scopes.md +92 -0
- package/src/skills/nest-best-practices/references/fundamentals-testing.md +142 -0
- package/src/skills/nest-best-practices/references/graphql-overview.md +233 -0
- package/src/skills/nest-best-practices/references/graphql-resolvers-mutations.md +199 -0
- package/src/skills/nest-best-practices/references/graphql-scalars-unions-enums.md +180 -0
- package/src/skills/nest-best-practices/references/graphql-subscriptions.md +228 -0
- package/src/skills/nest-best-practices/references/microservices-grpc.md +175 -0
- package/src/skills/nest-best-practices/references/microservices-overview.md +221 -0
- package/src/skills/nest-best-practices/references/microservices-transports.md +119 -0
- package/src/skills/nest-best-practices/references/openapi-swagger.md +207 -0
- package/src/skills/nest-best-practices/references/recipes-authentication.md +97 -0
- package/src/skills/nest-best-practices/references/recipes-cqrs.md +176 -0
- package/src/skills/nest-best-practices/references/recipes-crud-generator.md +87 -0
- package/src/skills/nest-best-practices/references/recipes-documentation.md +93 -0
- package/src/skills/nest-best-practices/references/recipes-mongoose.md +153 -0
- package/src/skills/nest-best-practices/references/recipes-prisma.md +98 -0
- package/src/skills/nest-best-practices/references/recipes-terminus.md +148 -0
- package/src/skills/nest-best-practices/references/recipes-typeorm.md +122 -0
- package/src/skills/nest-best-practices/references/security-authorization.md +196 -0
- package/src/skills/nest-best-practices/references/security-cors-helmet-rate-limiting.md +204 -0
- package/src/skills/nest-best-practices/references/security-encryption-hashing.md +93 -0
- package/src/skills/nest-best-practices/references/techniques-caching.md +142 -0
- package/src/skills/nest-best-practices/references/techniques-compression-streaming-sse.md +194 -0
- package/src/skills/nest-best-practices/references/techniques-configuration.md +132 -0
- package/src/skills/nest-best-practices/references/techniques-database.md +153 -0
- package/src/skills/nest-best-practices/references/techniques-events.md +163 -0
- package/src/skills/nest-best-practices/references/techniques-fastify.md +137 -0
- package/src/skills/nest-best-practices/references/techniques-file-upload.md +140 -0
- package/src/skills/nest-best-practices/references/techniques-http-module.md +176 -0
- package/src/skills/nest-best-practices/references/techniques-logging.md +146 -0
- package/src/skills/nest-best-practices/references/techniques-mvc-serve-static.md +132 -0
- package/src/skills/nest-best-practices/references/techniques-queues.md +162 -0
- package/src/skills/nest-best-practices/references/techniques-serialization.md +158 -0
- package/src/skills/nest-best-practices/references/techniques-sessions-cookies.md +167 -0
- package/src/skills/nest-best-practices/references/techniques-task-scheduling.md +166 -0
- package/src/skills/nest-best-practices/references/techniques-validation.md +126 -0
- package/src/skills/nest-best-practices/references/techniques-versioning.md +153 -0
- package/src/skills/nest-best-practices/references/websockets-advanced.md +96 -0
- package/src/skills/nest-best-practices/references/websockets-gateways.md +215 -0
- package/src/skills/tailwindcss-best-practices/SKILL.md +180 -0
- package/src/skills/tailwindcss-best-practices/references/best-practices-utility-patterns.md +87 -0
- package/src/skills/tailwindcss-best-practices/references/core-installation.md +109 -0
- package/src/skills/tailwindcss-best-practices/references/core-preflight.md +200 -0
- package/src/skills/tailwindcss-best-practices/references/core-responsive.md +163 -0
- package/src/skills/tailwindcss-best-practices/references/core-source-detection.md +114 -0
- package/src/skills/tailwindcss-best-practices/references/core-theme.md +108 -0
- package/src/skills/tailwindcss-best-practices/references/core-utility-classes.md +59 -0
- package/src/skills/tailwindcss-best-practices/references/core-variants.md +204 -0
- package/src/skills/tailwindcss-best-practices/references/effects-form-controls.md +76 -0
- package/src/skills/tailwindcss-best-practices/references/effects-mask.md +91 -0
- package/src/skills/tailwindcss-best-practices/references/effects-scroll-snap.md +59 -0
- package/src/skills/tailwindcss-best-practices/references/effects-text-shadow.md +78 -0
- package/src/skills/tailwindcss-best-practices/references/effects-transition-animation.md +80 -0
- package/src/skills/tailwindcss-best-practices/references/effects-visibility-interactivity.md +82 -0
- package/src/skills/tailwindcss-best-practices/references/features-content-detection.md +175 -0
- package/src/skills/tailwindcss-best-practices/references/features-custom-styles.md +203 -0
- package/src/skills/tailwindcss-best-practices/references/features-dark-mode.md +137 -0
- package/src/skills/tailwindcss-best-practices/references/features-functions-directives.md +241 -0
- package/src/skills/tailwindcss-best-practices/references/features-upgrade.md +160 -0
- package/src/skills/tailwindcss-best-practices/references/layout-aspect-ratio.md +39 -0
- package/src/skills/tailwindcss-best-practices/references/layout-columns.md +80 -0
- package/src/skills/tailwindcss-best-practices/references/layout-display.md +110 -0
- package/src/skills/tailwindcss-best-practices/references/layout-flexbox.md +112 -0
- package/src/skills/tailwindcss-best-practices/references/layout-grid.md +87 -0
- package/src/skills/tailwindcss-best-practices/references/layout-height.md +97 -0
- package/src/skills/tailwindcss-best-practices/references/layout-inset.md +103 -0
- package/src/skills/tailwindcss-best-practices/references/layout-logical-properties.md +92 -0
- package/src/skills/tailwindcss-best-practices/references/layout-margin.md +126 -0
- package/src/skills/tailwindcss-best-practices/references/layout-min-max-sizing.md +63 -0
- package/src/skills/tailwindcss-best-practices/references/layout-object-fit-position.md +64 -0
- package/src/skills/tailwindcss-best-practices/references/layout-overflow.md +57 -0
- package/src/skills/tailwindcss-best-practices/references/layout-padding.md +77 -0
- package/src/skills/tailwindcss-best-practices/references/layout-position.md +85 -0
- package/src/skills/tailwindcss-best-practices/references/layout-tables.md +67 -0
- package/src/skills/tailwindcss-best-practices/references/layout-width.md +102 -0
- package/src/skills/tailwindcss-best-practices/references/transform-base.md +68 -0
- package/src/skills/tailwindcss-best-practices/references/transform-rotate.md +70 -0
- package/src/skills/tailwindcss-best-practices/references/transform-scale.md +83 -0
- package/src/skills/tailwindcss-best-practices/references/transform-skew.md +62 -0
- package/src/skills/tailwindcss-best-practices/references/transform-translate.md +77 -0
- package/src/skills/tailwindcss-best-practices/references/typography-font-text.md +142 -0
- package/src/skills/tailwindcss-best-practices/references/typography-list-style.md +65 -0
- package/src/skills/tailwindcss-best-practices/references/typography-text-align.md +60 -0
- package/src/skills/tailwindcss-best-practices/references/visual-background.md +76 -0
- package/src/skills/tailwindcss-best-practices/references/visual-border.md +108 -0
- package/src/skills/tailwindcss-best-practices/references/visual-effects.md +111 -0
- package/src/skills/tailwindcss-best-practices/references/visual-svg.md +82 -0
- package/src/skills/test-mobile-app/SKILL.md +11 -6
- package/src/skills/test-mobile-app/scripts/analyze_apk.py +15 -4
- package/src/skills/test-mobile-app/scripts/check_environment.py +5 -5
- package/src/skills/test-mobile-app/scripts/run_tests.py +1 -1
- package/src/skills/test-web-ui/SKILL.md +264 -84
- package/src/skills/test-web-ui/scripts/discover.py +25 -12
- package/src/skills/test-web-ui/scripts/run_tests.py +3 -2
- package/src/skills/typescript-expert/SKILL.md +145 -0
- package/src/skills/typescript-expert/commands/typescript-fix.md +65 -0
- package/src/skills/typescript-expert/references/advanced-conditional-types.md +190 -0
- package/src/skills/typescript-expert/references/advanced-decorators.md +243 -0
- package/src/skills/typescript-expert/references/advanced-mapped-types.md +223 -0
- package/src/skills/typescript-expert/references/advanced-template-literals.md +209 -0
- package/src/skills/typescript-expert/references/advanced-type-guards.md +308 -0
- package/src/skills/typescript-expert/references/best-practices-patterns.md +313 -0
- package/src/skills/typescript-expert/references/best-practices-performance.md +185 -0
- package/src/skills/typescript-expert/references/best-practices-tsconfig.md +242 -0
- package/src/skills/typescript-expert/references/core-generics.md +246 -0
- package/src/skills/typescript-expert/references/core-interfaces-types.md +231 -0
- package/src/skills/typescript-expert/references/core-type-system.md +261 -0
- package/src/skills/typescript-expert/references/core-utility-types.md +235 -0
- package/src/skills/typescript-expert/references/features-ts5x.md +370 -0
- package/src/skills/vite-best-practices/SKILL.md +115 -0
- package/src/skills/vite-best-practices/references/build-and-ssr.md +255 -0
- package/src/skills/vite-best-practices/references/core-config.md +231 -0
- package/src/skills/vite-best-practices/references/core-features.md +222 -0
- package/src/skills/vite-best-practices/references/core-plugin-api.md +294 -0
- package/src/skills/vite-best-practices/references/environment-api.md +108 -0
- package/src/skills/vite-best-practices/references/rolldown-migration.md +242 -0
- package/codex-cli-workspace/iteration-1/benchmark.json +0 -122
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/outputs/response.md +0 -163
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/grading.json +0 -58
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/outputs/response.md +0 -151
- package/codex-cli-workspace/iteration-1/eval-1-ci-integration/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -86
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -58
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
- package/codex-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/eval_metadata.json +0 -13
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/grading.json +0 -52
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/outputs/response.md +0 -130
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/with_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/grading.json +0 -64
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/outputs/response.md +0 -209
- package/codex-cli-workspace/iteration-1/eval-3-profiles-troubleshooting/without_skill/timing.json +0 -5
- package/codex-cli-workspace/iteration-1/review.html +0 -1325
- package/gemini-cli-workspace/iteration-1/benchmark.json +0 -86
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/outputs/response.md +0 -401
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/outputs/response.md +0 -405
- package/gemini-cli-workspace/iteration-1/eval-1-cicd-setup/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -212
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -427
- package/gemini-cli-workspace/iteration-1/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/eval_metadata.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -171
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -199
- package/gemini-cli-workspace/iteration-1/eval-3-custom-slash-command/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-1/review.html +0 -1325
- package/gemini-cli-workspace/iteration-2/benchmark.json +0 -173
- package/gemini-cli-workspace/iteration-2/benchmark.md +0 -28
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/outputs/response.md +0 -195
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/outputs/response.md +0 -377
- package/gemini-cli-workspace/iteration-2/eval-1-cicd-setup/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/eval_metadata.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/outputs/response.md +0 -127
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/grading.json +0 -37
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/outputs/response.md +0 -164
- package/gemini-cli-workspace/iteration-2/eval-2-mcp-server-config/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/eval_metadata.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/outputs/response.md +0 -91
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/with_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/grading.json +0 -32
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/outputs/response.md +0 -112
- package/gemini-cli-workspace/iteration-2/eval-3-custom-slash-command/without_skill/timing.json +0 -5
- package/gemini-cli-workspace/iteration-2/eval-viewer.html +0 -1325
- package/screen-recording-workspace/evals.json +0 -41
- package/screen-recording-workspace/iteration-1/benchmark.json +0 -102
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/outputs/demo.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/outputs/demo.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-0-fullscreen/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/outputs/region_capture.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/outputs/region_capture.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-1-region-audio/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/eval_metadata.json +0 -31
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/outputs/fallback_recording.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/with_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/grading.json +0 -11
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/fallback_recording.mp4 +0 -0
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/outputs/record_screen.py +0 -67
- package/screen-recording-workspace/iteration-1/eval-2-python-fallback/without_skill/timing.json +0 -5
- package/screen-recording-workspace/iteration-1/review.html +0 -1325
- package/src/skills/codex-cli/evals/evals.json +0 -47
- package/src/skills/gemini-cli/evals/evals.json +0 -46
- package/src/skills/tm-search/evals/evals.json +0 -23
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Interfaces vs Type Aliases
|
|
2
|
+
|
|
3
|
+
## Declaration Syntax
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// Interface — declares a named object shape
|
|
7
|
+
interface User {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
email: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Type alias — names any type expression
|
|
14
|
+
type User = {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
email: string;
|
|
18
|
+
};
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## When to Use Which
|
|
22
|
+
|
|
23
|
+
**Use `interface` when:**
|
|
24
|
+
- Defining object shapes that might be extended
|
|
25
|
+
- Creating public API contracts (libraries, modules)
|
|
26
|
+
- You want declaration merging (adding fields across files)
|
|
27
|
+
|
|
28
|
+
**Use `type` when:**
|
|
29
|
+
- Creating unions, intersections, tuples, mapped types
|
|
30
|
+
- Aliasing primitives or complex type expressions
|
|
31
|
+
- You need computed properties or template literals
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
// Only type can do these
|
|
35
|
+
type ID = string | number; // Union
|
|
36
|
+
type Pair<T> = [T, T]; // Tuple
|
|
37
|
+
type Keys = keyof User; // Keyof
|
|
38
|
+
type Nullable<T> = T | null; // Generic alias
|
|
39
|
+
type EventName = `on${Capitalize<string>}`; // Template literal
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
In practice, both work for object shapes. Pick one convention per project and be consistent.
|
|
43
|
+
|
|
44
|
+
## Extending and Composing
|
|
45
|
+
|
|
46
|
+
### Interface Extension
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
interface Animal {
|
|
50
|
+
name: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
interface Dog extends Animal {
|
|
54
|
+
breed: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Multiple extension
|
|
58
|
+
interface ServiceDog extends Dog, Trainable {
|
|
59
|
+
handler: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Interfaces can extend type aliases
|
|
63
|
+
type HasId = { id: string };
|
|
64
|
+
interface User extends HasId {
|
|
65
|
+
name: string;
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Type Intersection
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
type Animal = { name: string };
|
|
73
|
+
type Dog = Animal & { breed: string };
|
|
74
|
+
|
|
75
|
+
// Intersections work with interfaces too
|
|
76
|
+
interface HasId { id: string }
|
|
77
|
+
type User = HasId & { name: string };
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Key Difference — Conflict Resolution
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
// Interface extension: conflicts are errors
|
|
84
|
+
interface A { x: number }
|
|
85
|
+
interface B extends A { x: string } // Error! Type 'string' is not assignable to 'number'
|
|
86
|
+
|
|
87
|
+
// Type intersection: conflicts create never
|
|
88
|
+
type A = { x: number };
|
|
89
|
+
type B = A & { x: string }; // x is never (number & string = never)
|
|
90
|
+
// No error at definition — but you can never create a valid B
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Declaration Merging
|
|
94
|
+
|
|
95
|
+
Interfaces with the same name in the same scope merge automatically. Type aliases cannot merge:
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// Declaration merging — both declarations combine
|
|
99
|
+
interface Window {
|
|
100
|
+
myCustomProp: string;
|
|
101
|
+
}
|
|
102
|
+
// Now Window has myCustomProp in addition to all standard properties
|
|
103
|
+
|
|
104
|
+
// This is how library augmentation works:
|
|
105
|
+
declare module "express" {
|
|
106
|
+
interface Request {
|
|
107
|
+
user?: User; // Adds user to Express Request
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Type aliases produce an error if you declare the same name twice:
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
type Foo = { a: string };
|
|
116
|
+
type Foo = { b: number }; // Error! Duplicate identifier 'Foo'
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Implementing Interfaces
|
|
120
|
+
|
|
121
|
+
Classes can implement interfaces to ensure they satisfy a contract:
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
interface Serializable {
|
|
125
|
+
serialize(): string;
|
|
126
|
+
deserialize(data: string): void;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
class Config implements Serializable {
|
|
130
|
+
serialize() { return JSON.stringify(this); }
|
|
131
|
+
deserialize(data: string) { Object.assign(this, JSON.parse(data)); }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Classes can implement multiple interfaces
|
|
135
|
+
class User implements Serializable, Comparable<User> { ... }
|
|
136
|
+
|
|
137
|
+
// Classes can also implement type aliases (if they describe object shapes)
|
|
138
|
+
type Printable = { print(): void };
|
|
139
|
+
class Report implements Printable {
|
|
140
|
+
print() { console.log("Report"); }
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Callable and Constructable Types
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
// Callable interface
|
|
148
|
+
interface SearchFunc {
|
|
149
|
+
(query: string, limit: number): SearchResult[];
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Equivalent type
|
|
153
|
+
type SearchFunc = (query: string, limit: number) => SearchResult[];
|
|
154
|
+
|
|
155
|
+
// Hybrid — object with call signature
|
|
156
|
+
interface Counter {
|
|
157
|
+
(): number; // Callable
|
|
158
|
+
count: number; // Property
|
|
159
|
+
reset(): void; // Method
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Constructable
|
|
163
|
+
interface ClockConstructor {
|
|
164
|
+
new (hour: number, minute: number): Clock;
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Index Signatures
|
|
169
|
+
|
|
170
|
+
```typescript
|
|
171
|
+
interface StringDictionary {
|
|
172
|
+
[key: string]: string;
|
|
173
|
+
name: string; // OK — string is assignable to string
|
|
174
|
+
// count: number; // Error — number not assignable to string
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Record is often cleaner than index signatures
|
|
178
|
+
type StringDict = Record<string, string>;
|
|
179
|
+
|
|
180
|
+
// Symbol index signatures (TS 4.4+)
|
|
181
|
+
interface SymbolMap {
|
|
182
|
+
[key: symbol]: unknown;
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Readonly and Optional
|
|
187
|
+
|
|
188
|
+
```typescript
|
|
189
|
+
interface Config {
|
|
190
|
+
readonly host: string; // Cannot be reassigned after creation
|
|
191
|
+
readonly port: number;
|
|
192
|
+
debug?: boolean; // Optional
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const config: Config = { host: "localhost", port: 3000 };
|
|
196
|
+
config.host = "0.0.0.0"; // Error! Cannot assign to 'host'
|
|
197
|
+
|
|
198
|
+
// Deeply readonly with utility type
|
|
199
|
+
type DeepReadonly<T> = {
|
|
200
|
+
readonly [K in keyof T]: T[K] extends object ? DeepReadonly<T[K]> : T[K];
|
|
201
|
+
};
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## Generic Interfaces and Types
|
|
205
|
+
|
|
206
|
+
```typescript
|
|
207
|
+
// Generic interface
|
|
208
|
+
interface Repository<T> {
|
|
209
|
+
findById(id: string): Promise<T | null>;
|
|
210
|
+
findAll(): Promise<T[]>;
|
|
211
|
+
save(entity: T): Promise<T>;
|
|
212
|
+
delete(id: string): Promise<void>;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Usage
|
|
216
|
+
class UserRepository implements Repository<User> { ... }
|
|
217
|
+
|
|
218
|
+
// Generic type with default
|
|
219
|
+
type Container<T = unknown> = {
|
|
220
|
+
value: T;
|
|
221
|
+
metadata: Record<string, string>;
|
|
222
|
+
};
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Best Practices
|
|
226
|
+
|
|
227
|
+
1. **Don't use `I` prefix** — `IUser` is a C# convention, not TypeScript. Use `User`.
|
|
228
|
+
2. **Prefer narrow types** — `string` is usually too broad. Use literals or branded types.
|
|
229
|
+
3. **Avoid empty interfaces** — `interface Empty {}` matches almost everything due to structural typing.
|
|
230
|
+
4. **Use `readonly` by default** — Make properties mutable only when mutation is required.
|
|
231
|
+
5. **Single responsibility** — Keep interfaces focused. Compose with `extends` or `&`.
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# Core Type System
|
|
2
|
+
|
|
3
|
+
## Primitive Types
|
|
4
|
+
|
|
5
|
+
TypeScript has the same primitive types as JavaScript, plus a few extras:
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// JavaScript primitives
|
|
9
|
+
let str: string = "hello";
|
|
10
|
+
let num: number = 42;
|
|
11
|
+
let big: bigint = 100n;
|
|
12
|
+
let bool: boolean = true;
|
|
13
|
+
let sym: symbol = Symbol("key");
|
|
14
|
+
let undef: undefined = undefined;
|
|
15
|
+
let nul: null = null;
|
|
16
|
+
|
|
17
|
+
// TypeScript additions
|
|
18
|
+
let any_val: any; // Opts out of type checking — avoid
|
|
19
|
+
let unknown_val: unknown; // Type-safe alternative to any
|
|
20
|
+
let never_val: never; // Represents values that never occur
|
|
21
|
+
let void_val: void; // Functions that don't return a value
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### `never` — The Bottom Type
|
|
25
|
+
|
|
26
|
+
`never` is the type of values that never occur. It's the return type of functions that always throw or have infinite loops, and it's what you get when you exhaust all possibilities in a union:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
function fail(message: string): never {
|
|
30
|
+
throw new Error(message);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Exhaustiveness checking — never catches missing cases
|
|
34
|
+
type Shape = "circle" | "square" | "triangle";
|
|
35
|
+
function area(shape: Shape): number {
|
|
36
|
+
switch (shape) {
|
|
37
|
+
case "circle": return Math.PI;
|
|
38
|
+
case "square": return 1;
|
|
39
|
+
case "triangle": return 0.5;
|
|
40
|
+
default:
|
|
41
|
+
// If we add a new shape to the union and forget to handle it,
|
|
42
|
+
// this line will show a compile error
|
|
43
|
+
const _exhaustive: never = shape;
|
|
44
|
+
return _exhaustive;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### `void` vs `undefined`
|
|
50
|
+
|
|
51
|
+
`void` means a function doesn't return a meaningful value. `undefined` is a specific value:
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// void — callback return value is ignored
|
|
55
|
+
type Callback = () => void;
|
|
56
|
+
const cb: Callback = () => 42; // OK! void means "return value ignored"
|
|
57
|
+
|
|
58
|
+
// undefined — must literally return undefined
|
|
59
|
+
type UndefinedFn = () => undefined;
|
|
60
|
+
const fn: UndefinedFn = () => 42; // Error!
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Type Annotations vs Inference
|
|
64
|
+
|
|
65
|
+
TypeScript infers types from initialization, return statements, and context:
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
// Inference works for:
|
|
69
|
+
const x = 10; // number
|
|
70
|
+
const arr = [1, 2, 3]; // number[]
|
|
71
|
+
const obj = { a: 1, b: "hi" }; // { a: number; b: string }
|
|
72
|
+
|
|
73
|
+
// Contextual typing — parameter types inferred from context
|
|
74
|
+
const names = ["Alice", "Bob"];
|
|
75
|
+
names.forEach(name => {
|
|
76
|
+
console.log(name.toUpperCase()); // name inferred as string
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// Annotate when inference isn't enough:
|
|
80
|
+
// 1. Function parameters (always annotate)
|
|
81
|
+
function greet(name: string) { ... }
|
|
82
|
+
|
|
83
|
+
// 2. Empty collections
|
|
84
|
+
const items: string[] = [];
|
|
85
|
+
|
|
86
|
+
// 3. Public API return types (documentation + refactoring safety)
|
|
87
|
+
export function parse(input: string): AST { ... }
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Type Narrowing
|
|
91
|
+
|
|
92
|
+
TypeScript narrows types based on control flow analysis:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
function process(value: string | number) {
|
|
96
|
+
// typeof guard
|
|
97
|
+
if (typeof value === "string") {
|
|
98
|
+
value.toUpperCase(); // value is string here
|
|
99
|
+
} else {
|
|
100
|
+
value.toFixed(2); // value is number here
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Truthiness narrowing
|
|
105
|
+
function printName(name: string | null) {
|
|
106
|
+
if (name) {
|
|
107
|
+
console.log(name.toUpperCase()); // name is string (null removed)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// instanceof narrowing
|
|
112
|
+
function logDate(date: Date | string) {
|
|
113
|
+
if (date instanceof Date) {
|
|
114
|
+
date.getFullYear(); // Date
|
|
115
|
+
} else {
|
|
116
|
+
Date.parse(date); // string
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// in narrowing
|
|
121
|
+
interface Fish { swim(): void }
|
|
122
|
+
interface Bird { fly(): void }
|
|
123
|
+
function move(animal: Fish | Bird) {
|
|
124
|
+
if ("swim" in animal) {
|
|
125
|
+
animal.swim(); // Fish
|
|
126
|
+
} else {
|
|
127
|
+
animal.fly(); // Bird
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Equality narrowing
|
|
132
|
+
function compare(a: string | number, b: string | boolean) {
|
|
133
|
+
if (a === b) {
|
|
134
|
+
// Both must be string (only common type)
|
|
135
|
+
a.toUpperCase();
|
|
136
|
+
b.toUpperCase();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Literal Types
|
|
142
|
+
|
|
143
|
+
TypeScript can narrow types to exact values:
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
// String literal types
|
|
147
|
+
type Direction = "north" | "south" | "east" | "west";
|
|
148
|
+
|
|
149
|
+
// Numeric literal types
|
|
150
|
+
type DiceRoll = 1 | 2 | 3 | 4 | 5 | 6;
|
|
151
|
+
|
|
152
|
+
// Boolean literal types
|
|
153
|
+
type True = true;
|
|
154
|
+
|
|
155
|
+
// const assertions freeze literals
|
|
156
|
+
const config = {
|
|
157
|
+
endpoint: "/api",
|
|
158
|
+
retries: 3,
|
|
159
|
+
} as const;
|
|
160
|
+
// Type: { readonly endpoint: "/api"; readonly retries: 3 }
|
|
161
|
+
|
|
162
|
+
// let vs const inference
|
|
163
|
+
let x = "hello"; // type: string
|
|
164
|
+
const y = "hello"; // type: "hello" (literal)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Tuple Types
|
|
168
|
+
|
|
169
|
+
Fixed-length arrays with known types at each position:
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
// Basic tuple
|
|
173
|
+
type Point = [number, number];
|
|
174
|
+
const p: Point = [10, 20];
|
|
175
|
+
|
|
176
|
+
// Named tuple elements (documentation only, no runtime effect)
|
|
177
|
+
type Range = [start: number, end: number];
|
|
178
|
+
|
|
179
|
+
// Optional elements
|
|
180
|
+
type FlexPoint = [number, number, number?];
|
|
181
|
+
const p2: FlexPoint = [1, 2]; // OK
|
|
182
|
+
const p3: FlexPoint = [1, 2, 3]; // OK
|
|
183
|
+
|
|
184
|
+
// Rest elements
|
|
185
|
+
type StringsThenNumber = [...string[], number];
|
|
186
|
+
const val: StringsThenNumber = ["a", "b", 42]; // OK
|
|
187
|
+
|
|
188
|
+
// Readonly tuples
|
|
189
|
+
type ReadonlyPair = readonly [string, number];
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Arrays
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
// Two equivalent syntaxes
|
|
196
|
+
let nums: number[] = [1, 2, 3];
|
|
197
|
+
let strs: Array<string> = ["a", "b"];
|
|
198
|
+
|
|
199
|
+
// Readonly arrays — prevent mutation
|
|
200
|
+
let frozen: readonly number[] = [1, 2, 3];
|
|
201
|
+
frozen.push(4); // Error! Property 'push' does not exist on readonly number[]
|
|
202
|
+
|
|
203
|
+
// ReadonlyArray<T> is equivalent
|
|
204
|
+
let frozen2: ReadonlyArray<number> = [1, 2, 3];
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Object Types
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
// Inline object type
|
|
211
|
+
function printCoord(pt: { x: number; y: number }) {
|
|
212
|
+
console.log(pt.x, pt.y);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// Optional properties
|
|
216
|
+
function printName(obj: { first: string; last?: string }) {
|
|
217
|
+
console.log(obj.first);
|
|
218
|
+
console.log(obj.last?.toUpperCase()); // Optional chaining
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Index signatures
|
|
222
|
+
interface StringMap {
|
|
223
|
+
[key: string]: string;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Intersection types — combine shapes
|
|
227
|
+
type Named = { name: string };
|
|
228
|
+
type Aged = { age: number };
|
|
229
|
+
type Person = Named & Aged; // { name: string; age: number }
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Union Types
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// Union of primitives
|
|
236
|
+
type StringOrNumber = string | number;
|
|
237
|
+
|
|
238
|
+
// Union of object types
|
|
239
|
+
type Result<T> = { ok: true; value: T } | { ok: false; error: Error };
|
|
240
|
+
|
|
241
|
+
// Narrowing unions
|
|
242
|
+
function handle(result: Result<string>) {
|
|
243
|
+
if (result.ok) {
|
|
244
|
+
console.log(result.value); // string
|
|
245
|
+
} else {
|
|
246
|
+
console.log(result.error.message); // Error
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Special Types Reference
|
|
252
|
+
|
|
253
|
+
| Type | Meaning | Use for |
|
|
254
|
+
|------|---------|---------|
|
|
255
|
+
| `any` | Disables checking | Migration from JS (temporarily) |
|
|
256
|
+
| `unknown` | Must narrow before use | Safe alternative to `any` |
|
|
257
|
+
| `never` | No possible value | Exhaustiveness, impossible branches |
|
|
258
|
+
| `void` | No meaningful return | Callbacks whose return is ignored |
|
|
259
|
+
| `object` | Any non-primitive | Constraining to objects |
|
|
260
|
+
| `{}` | Any non-nullish value | Almost never — too permissive |
|
|
261
|
+
| `Object` | Like `{}` | Never use this |
|