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 };
错误原因
- Promise未触发解析:在
code()的Promise回调中,错误使用了resolve: (...)的对象字面量语法,而非调用resolve()函数。这导致Promise一直处于pending状态,测试超时。 - 泛型不符合需求:
code()定义了泛型<T>,但需求明确返回解析为字符串的Promise,泛型会引入类型不确定性,不符合设计要求。 - 错误处理方式错误:在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
相关产品推荐
相关产品推荐

