TypeScript3.0 - ארגומנטים של callback ב-TypeScript, המוגדרים באמצעות פונקציה
יש לי מצב שבו אני קורא לפונקציה עם כמה ארגומנטים, שמופקדים באמצעות פונקציה אחרת.
ככה הקוד נראה.
function getArgs (): [string, number] {
return ['hello world', 22]
}
function callFnWithArgs (callback) {
callback(...getArgs())
}
callFnWithArgs(function (/* typehint here */) {
})
- הפונקציה
callFnWithArgsמקבלת פונקציית קריאה חזרה ואז מבצעת אותה על ידי העברת כמה ארגומנטים. - הארגומנטים האלה ניתנים על ידי פונקציה אחרת שנקראת
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) => {
})
