Files
code-review-skill/references/typescript.md
Tu Shaokun 9a4d4c4535 refactor: 模块化 skill 结构,支持按需加载
- 将 SKILL.md 从 1774 行精简到 ~180 行
- 新增 references/react.md:React 19、RSC、TanStack Query v5
- 新增 references/vue.md:Vue 3 Composition API
- 新增 references/rust.md:所有权、unsafe、异步
- 新增 references/typescript.md:类型安全、async/await
- 新增 references/python.md:常见陷阱
- 更新 README.md:说明按需加载机制

优化效果:
- 初始加载:~40K tokens → ~4K tokens
- 支持 Progressive Disclosure 按需加载
2025-11-29 13:39:43 +08:00

2.2 KiB
Raw Blame History

TypeScript/JavaScript Code Review Guide

TypeScript/JavaScript 通用代码审查指南,覆盖类型安全、异步处理、常见陷阱。


类型安全

避免使用 any

// ❌ Using any defeats type safety
function processData(data: any) {  // Avoid any
    return data.value;
}

// ✅ Use proper types
interface DataPayload {
    value: string;
}
function processData(data: DataPayload) {
    return data.value;
}

异步处理

错误处理

// ❌ Not handling async errors
async function fetchUser(id: string) {
    const response = await fetch(`/api/users/${id}`);
    return response.json();  // What if network fails?
}

// ✅ Handle errors properly
async function fetchUser(id: string): Promise<User> {
    try {
        const response = await fetch(`/api/users/${id}`);
        if (!response.ok) {
            throw new Error(`HTTP ${response.status}`);
        }
        return await response.json();
    } catch (error) {
        console.error('Failed to fetch user:', error);
        throw error;
    }
}

不可变性

避免直接修改 Props/参数

// ❌ Mutation of props
function UserProfile({ user }: Props) {
    user.lastViewed = new Date();  // Mutating prop!
    return <div>{user.name}</div>;
}

// ✅ Don't mutate props
function UserProfile({ user, onView }: Props) {
    useEffect(() => {
        onView(user.id);  // Notify parent to update
    }, [user.id]);
    return <div>{user.name}</div>;
}

TypeScript Review Checklist

类型系统

  • 没有使用 any(使用 unknown 代替未知类型)
  • 接口和类型定义完整
  • 使用泛型提高代码复用性
  • 联合类型有正确的类型收窄

异步代码

  • async 函数有错误处理
  • Promise rejection 被正确处理
  • 避免 callback hell使用 async/await
  • 并发请求使用 Promise.allPromise.allSettled

不可变性

  • 不直接修改函数参数
  • 使用 spread 操作符创建新对象/数组
  • 考虑使用 readonly 修饰符

代码质量

  • 启用 strict 模式
  • ESLint/TSLint 无警告
  • 函数有返回类型注解
  • 避免类型断言(as),除非确实必要