繁体   English   中英

有没有办法在打字稿上使用 util.promisify 继承方法签名?

[英]Is there any way to inherit method signature with util.promisify on typescript?

v8.0.0 Node 开始提供util.promisify() API。 现在我正在尝试将一些回调风格的方法转换成 async/await 风格。 在打字稿上, util.promisify()可能不会继承方法签名:

import fs = require('fs');

export namespace AsyncFs {
    export const lstat = util.promisify(fs.lstat);
    // there's no method signature, only shows as "Function"
}

虽然我们可以为每个方法添加新的签名......

export const lstat = util.promisify(fs.lstat) as (path: string | Buffer) => fs.Stats;

所以我正在寻找一种自动继承签名的好方法。 是否可以? 你有什么好主意吗?

谢谢。

如果不是由 TS 内部处理,那么您可能必须自己定义util.promisify()的类型,执行类似于他们在绝对类型中为 Bluebird 的 promisify() 静态函数所做的事情。

  static promisify<T>(func: (callback: (err: any, result: T) => void) => void, options?: Bluebird.PromisifyOptions): () => Bluebird<T>;
  static promisify<T, A1>(func: (arg1: A1, callback: (err: any, result: T) => void) => void, options?: Bluebird.PromisifyOptions): (arg1: A1) => Bluebird<T>;
  static promisify<T, A1, A2>(func: (arg1: A1, arg2: A2, callback: (err: any, result: T) => void) => void, options?: Bluebird.PromisifyOptions): (arg1: A1, arg2: A2) => Bluebird<T>;
  static promisify<T, A1, A2, A3>(func: (arg1: A1, arg2: A2, arg3: A3, callback: (err: any, result: T) => void) => void, options?: Bluebird.PromisifyOptions): (arg1: A1, arg2: A2, arg3: A3) => Bluebird<T>;
  static promisify<T, A1, A2, A3, A4>(func: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, callback: (err: any, result: T) => void) => void, options?: Bluebird.PromisifyOptions): (arg1: A1, arg2: A2, arg3: A3, arg4: A4) => Bluebird<T>;
  static promisify<T, A1, A2, A3, A4, A5>(func: (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5, callback: (err: any, result: T) => void) => void, options?: Bluebird.PromisifyOptions): (arg1: A1, arg2: A2, arg3: A3, arg4: A4, arg5: A5) => Bluebird<T>;

在类型系统无法推断出promisified 函数签名的情况下,您可以使用泛型提供类型提示:

import { promisify } from 'util';
import jsonwebtoken from 'jsonwebtoken';
import type { VerifyOptions, Secret } from 'jsonwebtoken';


const verify = promisify<string, Secret, VerifyOptions | undefined, JwtExtendedPayload>(jsonwebtoken.verify);

这将产生以下结果:

const verify: (arg1: string, arg2: jsonwebtoken.Secret, arg3: jsonwebtoken.VerifyOptions | undefined) => Promise<JwtExtendedPayload>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM