TypeScript Style Guide完全指南打造一致可维护代码的终极规范【免费下载链接】typescript-style-guide⚙️ TypeScript Style Guide. A concise set of conventions and best practices for creating consistent, maintainable code.项目地址: https://gitcode.com/gh_mirrors/ty/typescript-style-guide想要写出优雅、一致且易于维护的TypeScript代码吗TypeScript Style Guide提供了一个简洁而全面的规范集合帮助团队建立统一的编码标准显著提升代码质量和开发效率。无论你是TypeScript新手还是资深开发者这份终极指南都将为你揭示打造高质量TypeScript代码的关键技巧和最佳实践。为什么需要TypeScript代码规范随着项目规模和复杂度的增长保持代码质量和一致性变得越来越具有挑战性。TypeScript Style Guide通过定义标准化的编码方法为团队提供了一套明确的指导原则提升代码一致性统一的编码风格让整个代码库保持一致减少认知负担提高开发效率减少代码评审中的风格讨论节省团队时间和精力增强可维护性清晰的规范和最佳实践使代码更易于理解和维护预防常见错误通过类型安全和编码约定提前发现潜在问题核心类型系统最佳实践类型推断与显式声明TypeScript的强大类型推断能力是其核心优势之一。作为一般规则只有在有助于缩小类型范围时才显式声明类型// ✅ 推荐让TypeScript自动推断 const USER_ROLE admin; // 推断为字面量类型 admin const employees new Map([[Gabriel, 32]]); // 推断为 Mapstring, number // ✅ 需要时显式声明以缩小类型范围 const [userRole, setUserRole] useStateUserRole(admin);数据不可变性原则不可变性是函数式编程的核心概念TypeScript通过Readonly和ReadonlyArray等类型支持这一理念// ❌ 避免可能意外修改数据 const removeFirstUser (users: ArrayUser) users.splice(1); // ✅ 推荐使用只读类型防止意外修改 const removeFirstUser (users: ReadonlyArrayUser) users.slice(1);对象属性设计原则努力使大多数对象属性成为必需属性谨慎使用可选属性。这种设计方法反映了类型安全和可维护代码的理念清晰性和可预测性必需属性明确表明哪些数据始终需要类型安全TypeScript可以在编译时强制必需属性的存在减少可选链使用过多的可选属性会导致大量可选链操作使代码混乱区分联合类型的力量如果只能选择一个TypeScript特性请拥抱区分联合类型。这种强大的概念可以建模复杂的数据结构并提高类型安全性// ✅ 使用区分联合类型代替多个布尔标志 type User AdminUser | RegularUser | GuestUser; const regularUser: User { role: regular, id: 212, email: leauser.com, // 编译器会确保只有相关属性被设置 };类型安全的常量定义as const satisfies语法结合了严格的类型检查和不可变性特别适合定义需要符合特定类型的常量// ✅ 使用不可变的窄类型常量 const DASHBOARD_ACCESS_ROLES [admin, editor, moderator] as const satisfies ReadonlyArrayUserRole;函数设计与最佳实践函数设计原则函数应该遵循以下约定部分源自函数式编程的基本概念单一职责每个函数只做一件事无状态性相同输入参数总是返回相同值最少一个参数和返回值保持函数接口清晰纯函数避免副作用不修改或访问本地环境之外的变量值参数设计技巧为了保持函数的可读性和未来可扩展性尽量使用单个对象作为函数参数// ✅ 推荐使用选项对象作为参数 transformUserInput({ method: client, isValidated: false, minLines: 60, maxLines: 120, defaultInput: null, shouldLog: true, timeout: 2000, });返回值类型策略作为经验法则外部要明确内部要隐式。例如在构建API或库时始终显式地类型化所有内容以避免意外的破坏性更改。对于内部逻辑让TypeScript推断其默认值// ✅ 外部API显式返回类型 export const getUserById (id: string): User { // 实现细节 }; // ✅ 内部逻辑让TypeScript推断 const calculateDiscount (price: number, discount: number) { return price * (1 - discount); // 推断为 number };变量与常量管理常量断言的力量使用as const声明常量可以增强类型安全性和不可变性类型收窄确保字面量值被当作精确值处理不可变性对象和数组获得只读属性防止意外修改// ✅ 使用常量断言 const FOO_LOCATION { x: 50, y: 130 } as const; // 类型 { readonly x: 50; readonly y: 130; } FOO_LOCATION.x 10; // 错误无法赋值给只读属性枚举与常量断言的选择枚举在TypeScript生态系统中不鼓励使用因为它们有运行时成本和怪癖。作为经验法则优先选择字面量类型尽可能使用字面量类型常量断言数组当需要遍历值时使用常量断言对象当枚举任意值时使用// ✅ 使用字面量类型 - 类型在转译期间被剥离 type UserRole guest | moderator | administrator;类型联合与布尔标志拥抱类型联合特别是当类型联合选项互斥时而不是使用多个布尔标志变量// ❌ 避免多个布尔标志变量 const isPending, isProcessing, isConfirmed, isExpired; // ✅ 推荐使用类型联合变量 type UserStatus pending | processing | confirmed | expired; const userStatus: UserStatus;命名约定与代码组织命名规范一致性保持命名约定一致和可读提供重要的上下文信息因为你写的代码将由其他人维护局部变量驼峰命名法 -products,productsFiltered布尔值前缀为is,has等 -isDisabled,hasProduct常量大写 -FEATURED_PRODUCT_ID函数驼峰命名法 -filterProductsByType,formatCurrency类型帕斯卡命名法 -OrderStatus,ProductItem命名导出策略使用命名导出确保所有导入遵循统一模式。这保持了变量、函数等在完整代码库中的名称一致性// ✅ 使用命名导出 export const getUserById (id: string): User { /* ... */ }; export const updateUser (user: User): void { /* ... */ };代码组织与导入策略按功能组织每个应用程序或包中的项目文件/文件夹按功能组织和分组就近放置将相关代码尽可能靠近其使用位置导入路径同一功能内的文件使用相对导入其他情况使用绝对导入React组件开发规范属性设计原则努力使大多数属性成为必需属性谨慎使用可选属性。特别是在为第一个/单一用例创建新组件时大多数属性应该是必需的// ✅ 推荐使用区分联合类型消除可选属性 type StatusProps StatusSuccess | StatusLoading | StatusError; export const Status (status: StatusProps) { switch (props.status) { case success: return divTitle {props.title}/div; case loading: return divLoading {props.time}/div; case error: return divError {props.error}/div; } };组件类型分类容器组件所有容器组件都有后缀Container或Page包含业务逻辑和API集成结构示例ProductsPage/index.tsxUI功能组件为满足功能需求而设计的表示组件嵌套在容器组件文件夹内应尽可能遵循函数约定UI设计系统组件在整个代码库中使用的全局可重用/共享组件结构示例Button/index.tsx数据存储与传递策略仅传递必要属性向子组件传递仅需要的属性而不是传递整个对象URL状态存储充分利用URL存储状态特别是对于过滤、排序等避免同步不要将URL状态与本地状态同步优先使用属性传递考虑通过属性、URL或组合子组件简单传递数据全局状态作为最后手段将全局状态Zustand, Context作为最后的选择测试策略与最佳实践测试原则与模式自动化测试有助于我们编写更好的代码并使重构变得容易同时错误在流程早期被捕获✅ 应该做实现简短、明确、易于使用的测试遵循AAA模式Arrange-Act-Assert保持测试整洁有序测试业务逻辑就像用户使用应用一样使测试尽可能隔离不依赖执行顺序测试应该对变化具有弹性❌ 不应该做不要测试实现细节不要重新测试库/框架不要要求应用程序100%的代码覆盖率不要测试第三方依赖测试描述规范所有测试描述必须遵循命名约定it(should ... when ...)// ✅ 正确的测试描述 it(should return parsed date as YYYY-MM when input is in ISO date format); it(should render user description when title is confirmed);测试工具推荐除了通过脚本运行测试外强烈建议使用Vitest Runner和Playwright Test VS Code扩展。使用这些扩展任何单个单元/集成或E2E测试都可以立即运行特别是在较大的monorepo代码库中测试应用程序或包时。总结与实施建议TypeScript Style Guide提供了一套全面的最佳实践帮助团队建立统一的编码标准。记住这些关键要点拥抱常量断言以获得类型安全性和不可变性努力实现数据不可变性使用Readonly和ReadonlyArray等类型使大多数对象属性成为必需属性谨慎使用可选属性拥抱区分联合类型消除可选属性避免类型断言支持适当的类型定义努力使函数纯净、无状态且具有单一职责保持一致的命名约定在整个代码库中使用命名导出确保一致性按功能组织代码并将相关代码尽可能靠近放置开始实施这些最佳实践你将发现代码质量显著提升团队协作更加顺畅维护成本大幅降低。记住一致性是关键【免费下载链接】typescript-style-guide⚙️ TypeScript Style Guide. A concise set of conventions and best practices for creating consistent, maintainable code.项目地址: https://gitcode.com/gh_mirrors/ty/typescript-style-guide创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考