TypeScript3.0 - ארגומנטים של callback ב-TypeScript, המוגדרים באמצעות פונקציה


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

ככה הקוד נראה.

function getArgs (): [string, number] {
  return ['hello world', 22]
}

function callFnWithArgs (callback) {
  callback(...getArgs())
}

callFnWithArgs(function (/* typehint here */) {
})
  1. הפונקציה callFnWithArgs מקבלת פונקציית קריאה חזרה ואז מבצעת אותה על ידי העברת כמה ארגומנטים.
  2. הארגומנטים האלה ניתנים על ידי פונקציה אחרת שנקראת getArgs().

אז, האם יש דרך להקליד רמזים, את הפרמטרים של הקריאה חוזרת, שהיא הערך המוחזר של פונקציה אחרת?

תשובה #1

ב-TypeScript 3.0 או יותר חדש, ניתן להשתמש ב-alias של סוג ReturnType מהספרייה הסטנדרטית כדי לקבוע את סוג ההחזרה של getArgs ואז להשתמש בפרמטר מנוחה כדי לקשר את זה לקולבק של callFnWithArgs:

function getArgs (): [string, number] {
  return ['hello world', 22]
}

function callFnWithArgs (callback: (...args: ReturnType<typeof getArgs>) => void) {
  callback(...getArgs())
}

callFnWithArgs(function (a, b) {
  // a is string, b is number
})

תשובה #2

אתה יכול להגדיר את סוג ה-callback:

function callFnWithArgs (callback: (a: string, b: number) => void) {
  callback(...getArgs())
}

או אם קיימת אפשרות להעביר את הפרמטרים מהחוץ של הפונקציה callFnWithArgs, אתה יכול להשתמש בפרמטרים כלליים יתרים:

function getArgs (): [string, number] {
  return ['hello world', 22]
}

function callFnWithArgs<T extends any[]>(args: T, callback: (...args: T) => void) {
  callback(...args);
}

callFnWithArgs(getArgs(), (str, nr) => {
})

גישה נוספת תהיה ליצור גרסאות עמוסות עם סוגים גנריים עבור הפרמטרים:

function getArgs(): [string, number] {
  return ['hello world', 22]
}
function callFnWithArgs<T>(callback: (a: T) => void);
function callFnWithArgs<T1, T2>(callback: (a: T1, b: T2) => void);
function callFnWithArgs(callback: (...args: any[]) => void) {
  callback(...getArgs());
}

callFnWithArgs<string, number>((str, nr) => {
})