Skip to content

面试官:写一段代码证明你的 ts 水平

一个前端面试官,让你自由写一段 ts 代码,来证明你的 ts 水平,你可以帮我写一段吗

下面是一个简单的 TypeScript 代码示例,展示了一些 TypeScript 的基本特性,如接口、类型、类和泛型。这个例子是一个简单的任务管理应用,包括添加任务、完成任务以及列出所有任务的功能。

ts
// 定义一个任务接口
interface Task {
  id: number;
  title: string;
  completed: boolean;
}

// 定义一个任务管理类
class TaskManager {
  private tasks: Array<Task> = [];
  private taskIdCounter: number = 1;

  // 添加任务
  public addTask(title: string): void {
    const newTask: Task = {
      id: this.taskIdCounter,
      title: title,
      completed: false
    };
    this.tasks.push(newTask);
    this.taskIdCounter++;
  }

  // 完成任务
  public completeTask(id: number): void {
    const task = this.tasks.find((task) => task.id === id);
    if (task) {
      task.completed = true;
    } else {
      console.log(`任务ID ${id} 不存在`);
    }
  }

  // 列出所有任务
  public listTasks(): void {
    console.log('任务列表:');
    this.tasks.forEach((task) => {
      console.log(`ID: ${task.id}, 标题: ${task.title}, 完成: ${task.completed ? '是' : '否'}`);
    });
  }
}

// 使用任务管理类
const taskManager = new TaskManager();
taskManager.addTask('学习 TypeScript');
taskManager.addTask('学习 React');
taskManager.listTasks();
taskManager.completeTask(1);
taskManager.listTasks();

// ----------------
// ----------------
// ----------------

这个代码可以证明你对 TypeScript 的基本概念有一定了解,包括类型注解、接口、类和泛型。当然,实际项目中 TypeScript 的使用会更加复杂,但这个示例足以展示你的基本技能。

可以更多一点吗

当然可以。下面的示例包含了 TypeScript 的一些更高级的特性,如装饰器、类型保护、联合类型、类型别名、映射类型等。这个示例展示了一个简单的事件总线,可以在组件之间发送和接收事件。

ts
// 事件类型
type EventType = string;

// 事件处理程序类型
type EventHandler<T> = (eventData: T) => void;

// 定义一个事件映射类型
type EventMap = {
  [key: string]: unknown;
};

// 定义一个类型保护函数
function isEventType(event: string | symbol): event is EventType {
  return typeof event === 'string';
}

// 事件总线类
class EventBus<E extends EventMap> {
  private listeners: Map<EventType, Array<EventHandler<unknown>>> = new Map();

  // 添加事件监听
  public on<T extends keyof E>(event: T, handler: EventHandler<E[T]>): void {
    if (isEventType(event)) {
      const handlers = this.listeners.get(event) || [];
      handlers.push(handler);
      this.listeners.set(event, handlers);
    }
  }

  // 移除事件监听
  public off<T extends keyof E>(event: T, handler: EventHandler<E[T]>): void {
    if (isEventType(event)) {
      const handlers = this.listeners.get(event);
      if (handlers) {
        this.listeners.set(
          event,
          handlers.filter((h) => h !== handler)
        );
      }
    }
  }

  // 触发事件
  public emit<T extends keyof E>(event: T, eventData: E[T]): void {
    if (isEventType(event)) {
      const handlers = this.listeners.get(event);
      if (handlers) {
        handlers.forEach((handler) => (handler as EventHandler<E[T]>)(eventData));
      }
    }
  }
}

// 使用示例

// 事件类型及其对应的数据类型
interface MyEvents {
  'user.login': {username: string; password: string};
  'user.logout': {username: string};
}

// 创建事件总线实例
const eventBus = new EventBus<MyEvents>();

// 添加事件监听
eventBus.on('user.login', ({username, password}) => {
  console.log(`用户 ${username} 登录,密码:${password}`);
});

eventBus.on('user.logout', ({username}) => {
  console.log(`用户 ${username} 登出`);
});

// 触发事件
eventBus.emit('user.login', {username: '张三', password: '123456'});
eventBus.emit('user.logout', {username: '张三'});

这个示例中的事件总线可以让你展示对 TypeScript 更高级特性的理解,包括类型保护、联合类型、类型别名、映射类型等。这将展示你具有较高水平的 TypeScript 技能。