TypeScript中如何正确返回携带ParsedAuthorizationResponse类型的Promise?
错误写法根因分析
- 第一种写法的核心问题:
- 泛型传参错误:
Promise<PAR>把已声明的运行时变量PAR当作类型传入,TS泛型要求尖括号内传入类型定义而非变量 - 未定义结构就直接实例化:
new ParsedAuthorizationResponse没有提前声明对应类/类型的结构,TS会直接报找不到标识符的错误 - 缺少Promise值绑定:仅写了Promise泛型占位,没有把实际的解析结果作为Promise的resolve返回值
- 泛型传参错误:
- 第二种写法的核心问题:
- 类型定义语法错误:
type ParsedAuthorizationResponse PAR = 'AUTHORIZED'不符合TS类型定义规范,正确语法为type 类型名 = 类型结构,中间多余插入了未定义的PAR标识 - 引用不存在的类型:
new Promise<PAR>中的PAR没有对应的类型定义,TS无法识别
- 类型定义语法错误:
正确实现方案
根据你需要的ParsedAuthorizationResponse结构,分两种常见场景实现:
场景1:ParsedAuthorizationResponse为固定取值的字面量联合类型
适合需要定义固定可选返回值的场景,代码实现:
// 第一步:明确定义ParsedAuthorizationResponse的可选取值 type ParsedAuthorizationResponse = | 'AUTHORIZED' | 'DENIED' | 'PENDING'; // 可按需扩展其他取值 // 第二步:按需求返回对应Promise async function parseAuthStatus(status: string): Promise<ParsedAuthorizationResponse> { if (status === 'COMPLETED') { // 直接返回匹配类型的实际值,TS会自动做类型校验 return 'AUTHORIZED'; } throw new Error('Authorization failed'); }
场景2:ParsedAuthorizationResponse为可实例化的类结构
适合需要给返回值挂载方法/属性的场景,代码实现:
// 第一步:定义ParsedAuthorizationResponse类的结构 class ParsedAuthorizationResponse { readonly authStatus: 'AUTHORIZED' | 'DENIED'; constructor(authStatus: 'AUTHORIZED' | 'DENIED') { this.authStatus = authStatus; } } // 第二步:返回绑定了实例的Promise function parseAuthStatus(status: string): Promise<ParsedAuthorizationResponse> { if (status === 'COMPLETED') { // 将实例作为resolve值传入Promise return Promise.resolve(new ParsedAuthorizationResponse('AUTHORIZED')); } // 错误场景通过reject返回,和抛出异常效果一致 return Promise.reject(new Error('Authorization failed')); }
关键注意事项
- Promise泛型尖括号内永远传入类型定义,禁止传入运行时变量
- 自定义类型必须通过
type或class语法提前声明结构,不能隐式使用 - 必须通过
Promise.resolve(实际值)或async函数return值的方式,把需要返回的内容绑定到Promise的结果中,不能仅写空的Promise占位
内容的提问来源于stack exchange,提问作者rajatplease
相关产品推荐
相关产品推荐

