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)');
    });
});
相关推荐
Zheng1131 小时前
【可视化大屏】将柱状图引入到html页面中
javascript·ajax·html
john_hjy1 小时前
【无标题】
javascript
软件开发技术深度爱好者2 小时前
用HTML5+CSS+JavaScript庆祝国庆
javascript·css·html5
汪子熙2 小时前
Angular 服务器端应用 ng-state tag 的作用介绍
前端·javascript·angular.js
applebomb3 小时前
【2024】uniapp 接入声网音频RTC【H5+Android】Unibest模板下Vue3+Typescript
typescript·uniapp·rtc·声网·unibest·agora
昨天;明天。今天。8 小时前
案例-表白墙简单实现
前端·javascript·css
安冬的码畜日常8 小时前
【玩转 JS 函数式编程_006】2.2 小试牛刀:用函数式编程(FP)实现事件只触发一次
开发语言·前端·javascript·函数式编程·tdd·fp·jasmine
小御姐@stella8 小时前
Vue 之组件插槽Slot用法(组件间通信一种方式)
前端·javascript·vue.js
GISer_Jing8 小时前
【React】增量传输与渲染
前端·javascript·面试
GISer_Jing8 小时前
WebGL在低配置电脑的应用
javascript