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

TypeScript中如何将crypto方法转为async/await语法并保留完整类型声明?

解决方案

方案1:使用Node.js原生Promise化API(最简便)

Node.js 15及以上版本官方提供了crypto/promises子模块,内置了所有crypto方法的Promise版本,原生保留完整的TypeScript类型声明和全部重载,无需自行包装:

import { randomFill } from 'crypto/promises';

// 三种调用方式全部支持,类型自动识别
const buf = Buffer.alloc(10);
// 用法1:仅传buffer
await randomFill(buf);
// 用法2:传buffer + offset
await randomFill(buf, 5);
// 用法3:传buffer + offset + size
await randomFill(buf, 2, 5);

方案2:手动声明重载适配低版本场景

如果使用的Node.js版本低于15,无法使用crypto/promises,可以手动给promisify后的方法补充重载声明,完整对齐原有类型:

import { randomFill as randomFillNative } from 'crypto';
import { promisify } from 'util';

const randomFillPromisified = promisify(randomFillNative);

// 逐一声明和原方法对齐的重载,去掉callback参数,返回Promise
export function randomFill<T extends NodeJS.ArrayBufferView>(buffer: T): Promise<T>;
export function randomFill<T extends NodeJS.ArrayBufferView>(buffer: T, offset: number): Promise<T>;
export function randomFill<T extends NodeJS.ArrayBufferView>(buffer: T, offset: number, size: number): Promise<T>;
export function randomFill<T extends NodeJS.ArrayBufferView>(...args: [T, number?, number?]): Promise<T> {
  return randomFillPromisified(...args as Parameters<typeof randomFillNative>);
}

原理解释

util和bluebird的promisify默认泛型仅支持推导单一函数签名,无法自动匹配原方法的多重重载,手动补充重载声明后即可完整保留原有类型提示,和原生调用体验一致。

内容的提问来源于stack exchange,提问作者Ruslan Plastun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 01:06:02