当前位置: 首页 > news >正文

typescript编程规范

TypeScript 编程规范的核心要点综合了 Google、Microsoft 及社区最佳实践一、命名规范表格类型规范示例变量/函数/参数camelCasegetUserInfo,userName类/接口/类型/枚举PascalCaseUserService,UserData常量UPPER_SNAKE_CASEMAX_USERS接口成员camelCase不使用I前缀枚举成员PascalCaseSyntaxKind.StringLiteral注意接口不要使用I前缀TypeScript 官方库如Window、Document都不使用I前缀。二、类型与类型安全1. 启用严格模式在tsconfig.json中必须启用strict: true这是类型安全的基础。JSON复制{ compilerOptions: { target: ES2022, module: NodeNext, strict: true, esModuleInterop: true, skipLibCheck: true, forceConsistentCasingInFileNames: true, noEmitOnError: true } }2. 避免使用any使用unknown 类型守卫替代any确保运行时安全。TypeScript复制// ❌ 避免 function process(data: any) { ... } // ✅ 推荐 function process(data: unknown) { if (typeof data string) { // 安全使用 data } }3. 类型断言使用as语法而非尖括号语法且必须添加注释说明原因。TypeScript复制// ❌ 避免 const x (Fooz).length; // ✅ 推荐 // z 必须是 Foo因为 ... const x (z as Foo).length;4. 优先使用undefined而非null除非 API 约定使用null如 Node.js 回调否则优先使用undefined。TypeScript复制// ❌ 避免 let foo { x: 123, y: undefined }; // ✅ 推荐 let foo: { x: number; y?: number } { x: 123 };三、函数规范1. 使用箭头函数表达式中优先使用箭头函数避免function关键字。TypeScript复制// ❌ 避免 bar(function() { ... }); // ✅ 推荐 bar(() { this.doSomething(); });2. 函数参数使用对象形式当参数超过一个时使用对象参数提高可读性和可扩展性。TypeScript复制// ❌ 避免 transformUserInput(client, false, 60, 120, null, true, 2000); // ✅ 推荐 transformUserInput({ method: client, isValidated: false, minLines: 60, maxLines: 120, defaultInput: null, shouldLog: true, timeout: 2000, });3. 纯函数与单一职责函数应该是纯函数相同输入始终返回相同输出函数应该无状态、无副作用函数应该单一职责四、类与可见性1. 限制可见性尽可能限制符号的可见性TypeScript 默认public不需要显式声明。TypeScript复制// ❌ 避免 class Foo { public bar new Bar(); constructor(public readonly baz: Baz) {} } // ✅ 推荐 class Foo { bar new Bar(); constructor(public baz: Baz) {} }2. 避免在静态方法中使用this静态方法中不应使用this静态字段也不应通过this访问。TypeScript复制// ❌ 避免 class ShoeStore { static storage: Storage ...; static isAvailable(s: Shoe) { return this.storage.has(s.id); // Bad } } // ✅ 推荐 class ShoeStore { static storage: Storage ...; static isAvailable(s: Shoe) { return ShoeStore.storage.has(s.id); } }五、代码格式表格规范推荐值缩进2 个空格不使用 Tab引号单引号分号必须使用分号不依赖 ASI数组注解Foo[]而非ArrayFoo文件编码UTF-8六、控制流与迭代1. 避免for...in使用for...of Object.keys()或for...of Object.entries()替代。TypeScript复制// ❌ 避免 for (const x in someObj) { ... } // ✅ 推荐 for (const x of Object.keys(someObj)) { ... } for (const [key, value] of Object.entries(someObj)) { ... }2. 多行控制流必须使用代码块TypeScript复制// ❌ 避免 if (x) x.doFoo(); for (let i 0; i x; i) doSomething(i); // ✅ 推荐 if (x) { x.doFoo(); } for (let i 0; i x; i) { doSomething(i); }七、不可变性与数据安全1. 使用const和readonly默认使用const数组和对象使用Readonly/ReadonlyArray。TypeScript复制// ❌ 避免数据突变 const removeFirstUser (users: ArrayUser) { return users.splice(1); }; // ✅ 推荐 const removeFirstUser (users: ReadonlyArrayUser) { return users.slice(1); // splice 会报错 };2. 使用 discriminated unions可辨识联合当对象有很多可选属性时使用可辨识联合替代。TypeScript复制// ❌ 避免过多可选属性 type User { id?: number; email?: string; adminPermissions?: string[]; }; // ✅ 推荐 type AdminUser { role: admin; id: number; adminPermissions: string[] }; type RegularUser { role: regular; id: number; email: string }; type User AdminUser | RegularUser;八、工程化最佳实践表格实践说明共享类型定义统一类型文件管理公共接口CI 强制类型检查类型检查作为代码提交的必要条件使用 ESLint Prettier自动化代码格式和规则检查渐进式迁移JS 项目逐步迁移.js→ts-check→.ts→strict避免过度复杂类型复杂条件类型会影响编译性能九、禁止使用的特性表格特性原因var函数作用域导致难以理解的 Bugconst enum对 JavaScript 用户不可见eval()/Function(string)安全隐患CSP 不兼容with严格模式已禁止debugger不应出现在生产代码包装对象new String()等行为异常如new Boolean(false)为true直接操作prototype使用class关键字更清晰十、推荐的工具链配置JSON复制// tsconfig.json { compilerOptions: { target: ES2022, module: NodeNext, strict: true, esModuleInterop: true, skipLibCheck: true, forceConsistentCasingInFileNames: true, noEmitOnError: true, noUnusedLocals: true, noUnusedParameters: true, noImplicitReturns: true, noFallthroughCasesInSwitch: true } }配合typescript-eslint的strict-type-checked配置使用效果更佳。
http://www.rkmt.cn/news/1405841.html

相关文章:

  • RabbitMQ 消息堆积怎么处理:消费者扩容、线程池与惰性队列
  • Obsidian主页模板:3款设计打造你的个性化知识管理中心
  • AI原生岗位暴增217%背后,ChatGPT驱动的8大传统职业重构清单,第4类从业者6个月内必须转型
  • 5分钟掌握WebODM:免费开源无人机影像处理终极指南
  • 多线程同步避坑:C#上位机中lock/Monitor/Mutex的选择
  • 5分钟成为资源下载高手:res-downloader小白入门全攻略
  • 从像素到方程:图像处理中椭圆任意变换的数学推导与实践
  • 掌握Macy.js:打造完美响应式瀑布流布局的5个核心技巧
  • 2026广州知识产权贯标认证测评|新规审核避坑、申报流程、补贴政策、靠谱机构选型大全 - 资讯速览
  • 2026年5月河北聚氨酯保温钢管/钢套钢保温钢管/3PE防腐钢管/带颈对焊法兰厂家综合解析 - 2026年企业资讯
  • 感受Taotoken低延迟与路由能力对应用响应速度的提升
  • 重新定义数据主权:如何让微信聊天记录真正属于你?
  • 百度网盘提取码智能获取:3秒解锁资源的终极指南
  • LabVIEW .NET互操作程序集实战:从VI到C#窗体的无缝集成
  • 二分查找法细节分析及案例操作
  • macOS光标自定义终极方案:用Mousecape免费打造个性化鼠标指针体验
  • 贵州想学应急救援技术专业,哪家学校好?2026最新全门槛择校指南 - 深度智识库
  • 普通程序员怎么用AI真正提效(不只让它写CRUD)
  • 小米跟进DeepSeek永久降价,大模型价格战升温!MiMo-V2.5系列API降幅达99%
  • InternLM2.5-1.8B-Chat性能深度评测:18亿参数模型的惊人表现
  • systemverilog中关于多线程的若干思考
  • 【ChatGPT商业化生死线】:权威复盘17家头部公司画布实践——仅3家实现LTV>CAC>3.0
  • 如何实现弱人工智能向强人工智能的跨越
  • QuickLyric终极指南:三步实现Android音乐歌词自动同步解决方案
  • AlmaLinux 同时发布 9.8 和 10.2 稳定版,新增软件包、提升安全性并支持 32 位软件
  • 2026年宁波10大知名商事争议律师(权威综合版) - 资讯速览
  • LongCat-Image-Edit-Turbo性能优化指南:平衡速度与质量的终极配置方案
  • 脉冲神经网络进阶:多室神经元与树突异质性计算架构解析
  • Keil µVision代码量超限(L6050U)错误解决方案
  • IP地址查询服务架构挑战与Go语言高性能解决方案