javascript - האם יש דרך לרשת חתימת פונקציה עם util.promisify ב-typescript?


מגרסה v8.0.0 נוד מספקת את API של util.promisify(). עכשיו אני מנסה להמיר כמה מתודות בסגנון callback לסגנון async/await. ב-TypeScript, 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;

אז אני מחפש דרך טובה לרשת חתימות אוטומטית. האם זה אפשרי? יש לך רעיונות טובים?

תודה.

תשובה #1

אם זה לא מטופל על ידי TypeScript באופן פנימי, אז סביר שתצטרך להגדיר את הסוג עבור util.promisify() בעצמך על ידי עשיית משהו דומה למה שהם עושים עבור הפונקציה הסטטית promisify() של Bluebird ב-DefinitelyTyped.

  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>;

תשובה #2

במקרים שבהם מערכת הטיפוסים אינה מצליחה להסיק את חתימת הפונקציה המקודמת, ניתן לספק רמזי טיפוס באמצעות גנריקה:

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>