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
相关产品推荐
相关产品推荐

