TypeScript中Promise化JWT verify遇参数错误ts(2554)如何解决?
解决TypeScript中util.promisify处理jwt.verify时的参数错误问题
问题场景
使用util.promisify包装jwt.verify后调用传入两个参数,出现TypeScript错误:Expected 1 argument, but got 2.ts(2554),但同步调用jwt.verify(token, secret)可正常运行。
修复方案
方案1:使用jsonwebtoken原生Promise方法(推荐)
新版jsonwebtoken已原生支持Promise,无需手动promisify,直接调用即可:
import jwt from 'jsonwebtoken'; const decoded = await jwt.verify(token, process.env.JWT_SECRET as string); console.log(decoded);
方案2:手动指定promisify的类型
如果必须使用util.promisify,需手动修正类型推断问题:
import util from 'util'; import jwt from 'jsonwebtoken'; import type { JwtPayload } from 'jsonwebtoken'; const verifyAsync = util.promisify<string, string, JwtPayload | string>(jwt.verify) as ( token: string, secret: string ) => Promise<JwtPayload | string>; const decoded = await verifyAsync(token, process.env.JWT_SECRET as string); console.log(decoded);
方案3:手动封装Promise
绕过util.promisify,自己写Promise包裹jwt.verify:
import jwt from 'jsonwebtoken'; import type { JwtPayload } from 'jsonwebtoken'; const verifyToken = (token: string, secret: string): Promise<JwtPayload | string> => { return new Promise((resolve, reject) => { jwt.verify(token, secret, (err, decoded) => { if (err) reject(err); else resolve(decoded as JwtPayload | string); }); }); }; const decoded = await verifyToken(token, process.env.JWT_SECRET as string); console.log(decoded);
问题原因
jwt.verify的函数签名包含多个可选参数(options和callback),util.promisify的TypeScript类型推断无法正确识别多参数的回调函数结构,导致生成的Promise化函数被错误推断为仅接受1个参数,从而触发类型错误。原生Promise方法则不存在这个类型推断问题,因此是最优解。
内容的提问来源于stack exchange,提问作者champer
相关产品推荐
相关产品推荐

