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)');
    });
});
相关推荐
燃先生._.3 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
高山我梦口香糖4 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
black^sugar5 小时前
纯前端实现更新检测
开发语言·前端·javascript
2401_857600956 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js
2401_857600956 小时前
数字时代的医疗挂号变革:SSM+Vue 系统设计与实现之道
前端·javascript·vue.js
GDAL6 小时前
vue入门教程:组件透传 Attributes
前端·javascript·vue.js
小白学大数据6 小时前
如何使用Selenium处理JavaScript动态加载的内容?
大数据·javascript·爬虫·selenium·测试工具
2402_857583496 小时前
基于 SSM 框架的 Vue 电脑测评系统:照亮电脑品质之路
前端·javascript·vue.js
java_heartLake7 小时前
Vue3之性能优化
javascript·vue.js·性能优化