mcpField
W
writing-typescript

writing-typescript

github.com/julianobarbosa开发14110 次安装2 天前更新
代码仓库

关于 writing-typescript

writing-typescript 是面向 TypeScript 开发者的编码技能资料,汇总严格类型、安全处理数据和组合式设计等原则,并提供工具链建议与代码模式。内容还涵盖配置、测试和常见陷阱。

主要功能

  1. 01严格类型与安全数据解析
  2. 02类型守卫和判别联合示例
  3. 03tsconfig 配置建议
  4. 04测试、格式化与 lint 工具链
  5. 05常见 TypeScript 陷阱说明

适用场景

  1. 01制定 TypeScript 项目的编码规范
  2. 02为边界数据编写类型安全解析
  3. 03配置构建、测试和代码检查流程

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/julianobarbosa/claude-code-skills --skill writing-typescript

安装后在 Claude Code 中输入/writing-typescript确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

PATTERNS.md
REACT.md
TESTING.md

详细介绍

TypeScript 开发(2025)

核心原则

  • 严格类型检查:启用所有严格检查
  • 解析,而非验证:在边界处转换不可信数据
  • 组合优于继承:使用小而专注的函数
  • 显式优于隐式:不使用 any,优先使用 unknown

工具链

bun          # Runtime + package manager (fast)
vite         # Frontend bundling
vitest       # Testing
eslint       # Linting
prettier     # Formatting

快速模式

类型守卫
function isUser(value: unknown): value is User {
  return typeof value === "object" && value !== null && "id" in value;
}
可辨识联合类型
type Result<T, E = Error> = { ok: true; value: T } | { ok: false; error: E };

function processResult<T>(result: Result<T>): T {
  if (result.ok) return result.value;
  throw result.error;
}
工具类型
type UserUpdate = Partial<User>;
type UserSummary = Pick<User, "id" | "name">;
type UserWithoutPassword = Omit<User, "password">;
type ReadonlyUser = Readonly<User>;

tsconfig.json 要点

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,
    "noImplicitReturns": true,
    "isolatedModules": true
  }
}

参考资料

命令

bun install              # Install deps
bun run build            # Build
bun test                 # Test
bun run lint             # Lint
bun run format           # Format

易错点

  • 在 verbatimModuleSyntax 下对命名导出使用 import type:仅导入类型的值会触发错误。解决方法:import { type Foo } from "mod"(内联标记)。
  • 对对象使用 as const:同时设为只读并缩窄为字面量类型 — 这不同于 as Foo(断言类型)或 satisfies Foo(验证但不扩大类型)。
  • satisfies 验证但不扩大类型;as 会扩大类型 — 在本应使用 satisfies 的地方使用 as,会在不知不觉中丢失字面量类型。
  • Array<T>.includes(x) 要求 x 的类型为 T — 无法从联合类型中进行收窄;标准解决方法是使用类型谓词辅助函数。
  • strictNullChecks: false 会使 ALL 类型的 T 都表示 T | null | undefined — 部分迁移会留下对可空性的错误描述。
  • tsconfig.json 的 extends 不会递归合并 compilerOptions.paths — 子级路径会替换父级路径,而不是与其合并。

评论

支持 Markdown