Skip to content
Back to skills

Write Type Safe Typescript

ASecurity

Write type-safe TypeScript with proper narrowing, inference patterns, and strict mode best practices.

  • 19 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 19, 2026
ai-agentstypescriptgoapi

Works with

  • api

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 19, 2026

npx -y skills add rondoflow/rondoflow --skill write-type-safe-typescript --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Write Type Safe Typescript?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Write Type Safe Typescript
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/rondoflow-write-type-safe-typescript/badge)](https://www.skillsdirectory.com/skills/rondoflow-write-type-safe-typescript)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: write-type-safe-typescript
description: "Write type-safe TypeScript with proper narrowing, inference patterns, and strict mode best practices."
category: "AI & Agents"
author: community
version: "1.0.2"
icon: bot
---

## When to Use

User needs TypeScript expertise — from basic typing to advanced generics. Agent handles type narrowing, inference, discriminated unions, and strict mode patterns.

## Quick Reference

| Topic | File |
|-------|------|
| Generic patterns | `generics.md` |
| Utility types | `utility-types.md` |
| Declaration files | `declarations.md` |
| Migration from JS | `migration.md` |

## Stop Using `any`

- `unknown` forces you to narrow before use — `any` silently breaks type safety
- API responses: type them or use `unknown`, never `any`
- When you don't know the type, that's `unknown`, not `any`

## Narrowing Failures

- `filter(Boolean)` doesn't narrow — use `.filter((x): x is T => Boolean(x))`
- `Object.keys(obj)` returns `string[]`, not `keyof typeof obj` — intentional, objects can have extra keys
- `Array.isArray()` narrows to `any[]` — may need assertion for element type
- `in` operator narrows but only if property is in exactly one branch of union

## Literal Type Traps

- `let x = "hello"` is `string` — use `const` or `as const` for literal type
- Object properties widen: `{ status: "ok" }` has `status: string` — use `as const` or type annotation
- Function return types widen — annotate explicitly for literal returns

## Inference Limits

- Callbacks lose inference in some array methods — annotate parameter when TS guesses wrong
- Generic functions need usage to infer — `fn<T>()` can't infer, pass a value or annotate
- Nested generics often fail — break into steps with explicit types

## Discriminated Unions

- Add a literal `type` or `kind` field to each variant — enables exhaustive switch
- Exhaustive check: `default: const _never: never = x` — compile error if case missed
- Don't mix discriminated with optional properties — breaks narrowing

## `satisfies` vs Type Annotation

- `const x: Type = val` widens to Type — loses literal info
- `const x = val satisfies Type` keeps literal, checks compatibility — prefer for config objects

## Strict Null Handling

- Optional chaining `?.` returns `undefined`, not `null` — matters for APIs expecting `null`
- `??` only catches `null`/`undefined` — `||` catches all falsy including `0` and `""`
- Non-null `!` should be last resort — prefer narrowing or early return

## Module Boundaries

- `import type` for type-only imports — stripped at runtime, avoids bundler issues
- Re-exporting types: `export type { X }` — prevents accidental runtime dependency
- `.d.ts` augmentation: use `declare module` with exact module path

Files in this skill

  • SKILL.md2.7 KB
  • manifest.json313 B

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…