You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中Promise未解决致测试超时问题排查与修复

问题排查:TypeScript Promise超时错误及修复方案

测试以下TypeScript代码时,终端报错:
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
需求是实现DeveloperInterface中的code()方法,该方法需返回一个解析为字符串的Promise,解析结果取决于Developer实例的name和language属性。当前实现存在错误,请求排查并指导正确的Promise解析方式。

原代码:

// TODO: Implement your developer interface and class in this file
interface DeveloperInterface {
  //Two getter methods getName(),
  //and getLanguage() that return a string
  getName() : string;
  getLanguage(): string;

  //The respective setter methods setName(name: string),
  //and setLanguage(language: string) without return value (void)
  setName(name: string) : void;
  setLanguage(language: string): void;

  //A method called code(),
  //which returns a Promise that resolves to a string
  code<T>(): Promise<T>;
}


//implementing the DeveloperInterface interface
class Developer implements DeveloperInterface{

  //constructor method
  constructor(name: string, language: string) {
    this.name = name;
    this.language = language;
  }

  //private class variables
  private name = '';
  private language = '';

  //providing getName method
  getName(): string {
    return this.name;
  }

  //providing setName method
  setName(name: string) {
    this.name = name;  
  }

  //providing getLanguage method
  getLanguage() {
    return this.language;
  }

  //providing setLanguage method
  setLanguage(language: string) {
    this.language = language;
  }

  //providing code method
  async code<T>(): Promise<T> {
    return new Promise<T>((resolve) => {
      if (this.getLanguage() === 'nodejs') {
        resolve: (`console.log("Hello, ${this.getName()}!")`);
      } else if (this.getLanguage() === 'java') {
        resolve: (`System.out.println("Hello, ${this.getName()}!")`);
      } else if (this.getLanguage() === 'python') {
        resolve: (`print("Hello, ${this.getName()}!")`);
      } else {
        throw new Error(`Unsupported language: ${this.getLanguage()}`);
      }
    });
  }
}

//Create and export (default) a Class Developer
export { Developer as default };

错误原因

  1. Promise未触发解析:在code()的Promise回调中,错误使用了resolve: (...)的对象字面量语法,而非调用resolve()函数。这导致Promise一直处于pending状态,测试超时。
  2. 泛型不符合需求:code()定义了泛型<T>,但需求明确返回解析为字符串的Promise,泛型会引入类型不确定性,不符合设计要求。
  3. 错误处理方式错误:在Promise回调内直接throw错误无法被Promise捕获,必须通过reject()方法拒绝Promise。

修复方案

  • 替换resolve: (...)为resolve(...),正确调用解析函数。
  • 移除code()的泛型,明确返回Promise<string>,保证类型安全。
  • 将throw new Error(...)改为reject(new Error(...)),让Promise正确处理错误。

修复后的完整代码:

// TODO: Implement your developer interface and class in this file
interface DeveloperInterface {
  //Two getter methods getName(),
  //and getLanguage() that return a string
  getName() : string;
  getLanguage(): string;

  //The respective setter methods setName(name: string),
  //and setLanguage(language: string) without return value (void)
  setName(name: string) : void;
  setLanguage(language: string): void;

  //A method called code(),
  //which returns a Promise that resolves to a string
  code(): Promise<string>;
}


//implementing the DeveloperInterface interface
class Developer implements DeveloperInterface{

  //constructor method
  constructor(name: string, language: string) {
    this.name = name;
    this.language = language;
  }

  //private class variables
  private name = '';
  private language = '';

  //providing getName method
  getName(): string {
    return this.name;
  }

  //providing setName method
  setName(name: string) {
    this.name = name;  
  }

  //providing getLanguage method
  getLanguage() {
    return this.language;
  }

  //providing setLanguage method
  setLanguage(language: string) {
    this.language = language;
  }

  //providing code method
  code(): Promise<string> {
    return new Promise((resolve, reject) => {
      if (this.getLanguage() === 'nodejs') {
        resolve(`console.log("Hello, ${this.getName()}!")`);
      } else if (this.getLanguage() === 'java') {
        resolve(`System.out.println("Hello, ${this.getName()}!")`);
      } else if (this.getLanguage() === 'python') {
        resolve(`print("Hello, ${this.getName()}!")`);
      } else {
        reject(new Error(`Unsupported language: ${this.getLanguage()}`));
      }
    });
  }
}

//Create and export (default) a Class Developer
export { Developer as default };

内容的提问来源于stack exchange,提问作者Bruno Franzini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:05:13