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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:40:31