HOW - 用 Typescript 编写一个比较好的 Class

目录

一、介绍

  1. 代码格式统一。包括统一缩进和尽量使用清晰且统一风格的变量和函数命名
  2. 注释和文档。编写必要且清晰的注释和文档
  3. 使用让面试官眼前一亮的现代新特性,代码简洁。例如可选链(Optional Chaining)、空值合并运算符(Nullish Coalescing Operator)等
  4. 执行性能有一定优化
  5. 遵循模块化设计。将代码分割成多个模块,便于管理和重用
  6. 错误处理。确保代码对错误有良好的处理机制,包括同步和异步错误
  7. 考虑到扩展性
  8. 单元测试

二、示例

以下是一个包含上述要素的示例TypeScript类,以及相应的单元测试:

2.1 示例类代码

typescript 复制代码
// utils/Logger.ts
export class Logger {
    log(message: string): void {
        console.log(message);
    }
    error(message: string): void {
        console.error(message);
    }
}

// models/User.ts
export class User {
    constructor(
        private id: number,
        private name: string,
        private email: string,
        private logger: Logger
    ) {}

    // 获取用户的简短描述
    getSummary(): string {
        return `User: ${this.name} (${this.email})`;
    }

    // 更新用户邮箱
    updateEmail(newEmail: string): void {
        if (this.validateEmail(newEmail)) {
            this.email = newEmail;
            this.logger.log(`Email updated to ${newEmail}`);
        } else {
            this.logger.error('Invalid email address');
        }
    }

    // 验证邮箱格式
    private validateEmail(email: string): boolean {
        const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
        return emailRegex.test(email);
    }
}

// index.ts
import { Logger } from './utils/Logger';
import { User } from './models/User';

const logger = new Logger();
const user = new User(1, 'John Doe', 'john.doe@example.com', logger);

console.log(user.getSummary());
user.updateEmail('new.email@example.com');

2.2 单元测试

typescript 复制代码
// tests/User.test.ts
import { Logger } from '../utils/Logger';
import { User } from '../models/User';

describe('User', () => {
    let logger: Logger;
    let user: User;

    beforeEach(() => {
        logger = new Logger();
        user = new User(1, 'John Doe', 'john.doe@example.com', logger);
    });

    it('should return user summary', () => {
        expect(user.getSummary()).toBe('User: John Doe (john.doe@example.com)');
    });

    it('should update email if valid', () => {
        const newEmail = 'new.email@example.com';
        user.updateEmail(newEmail);
        expect(user.getSummary()).toBe(`User: John Doe (${newEmail})`);
    });

    it('should not update email if invalid', () => {
        const invalidEmail = 'invalid-email';
        user.updateEmail(invalidEmail);
        expect(user.getSummary()).toBe('User: John Doe (john.doe@example.com)');
    });
});
相关推荐
默_笙34 分钟前
🧀 用户访问一个网站到底经历了什么?全栈部署的"城市观光"指南
前端·javascript
妙码生花1 小时前
使用git更新ai-go-admin框架
前端·人工智能·git·golang·typescript·php
晓天衡宇•评测社区2 小时前
Seedance 2.5 登顶图生视频榜单,Wan 3.0 在游戏与教育场景进入前列
前端·javascript·网络
卡皮巴拉c992 小时前
基于pnpm搭建monorepo项目
前端·javascript
jianpeng的工程笔记3 小时前
Colab Kaggle 防断开脚本
javascript·深度学习·kaggle·colab
三十而立洋4 小时前
JavaScript 原型链:一张图讲透「对象继承」的底层真相
前端·javascript
平头哥技术团队4 小时前
Day 13 | 调 line-height 和 margin:三处间距让名片页脱离模板感
开发语言·前端·javascript·学习·html5
老三_Micheal5 小时前
一文搞懂 Axios 请求参数详解:headers、params 与 body 的区别和使用场景
javascript
研☆香5 小时前
js中 onload 事件的用法
开发语言·javascript·ecmascript
志尊宝5 小时前
Vue3 零基础每日笔记(005):ref 响应式基础——为什么 script 里要 .value
前端·javascript·vue.js·笔记