איך להחיל טיפוס גנרי על פונקציה פנימית ב-TypeScript
אני מנסה לכתוב פונקציה כללית ב-TypeScript שבבסיס שלה מבצעת סינון מהמערך. הנה הפונקציה המקבילה ב-JavaScript
const filterByProp = function (prop, value) {
return function (item) {
return item[prop] === value;
}
}
const result = people.filter(filterByProp('age', 3))
הקוד שלמעלה עובד בסדר, אני רוצה להמיר את אותו הדבר ל-TypeScript.
פונקציית הטייפסקריפט למטה עובדת בסדר, אבל לפונקציה הפנימית אין סוג :(
גרסה 2:
const filterByProp2 = function <T, K extends keyof T>(prop: K, value: T[K]) {
return function (item): boolean {
return item[prop] === value;
}
}
גרסה 3:
להלן הקוד לא עובד כפי שמצופה. לאחר שהוחל סוג עבור פונקציה פנימית.
const filterByProp3 = function <T, K extends keyof T>(prop: K, value: T[K]) {
return function <T>(item: T): boolean {
return item[prop] === value;
}
}
שימוש :
const result3 = people.filter(filterByProp3<IUser, 'age'>('age', 3)) // Not sure how to pass for inner func <IUser>
קיבלתי שגיאה כמו
[ts] Type 'K' cannot be used to index type 'T'.
[ts] This condition will always return 'false' since the types 'T[K]' and 'T[K]' have no overlap.
מישהו יכול בבקשה לעזור איך לפתור את זה?
גרסה 4: זה עובד אבל אני מעדיף לפתור את הבעיה של גרסה 3.
function filterByProp4<T, K extends keyof T>(
prop: K,
entities: T[],
value: T[K]
) {
return entities.filter(e => e[prop] === value);
}
תשובה #1
אתה רק צריך לציין את פרמטר הסוג הזהה על הפונקציה הפנימית. TypeScript יזין T בהתאם לסוג ההחזרה הצפוי של הפונקציה החיצונית כאשר אתה משתמש בה כארגומנט ל-filter, אז אין צורך בפרמטרי סוג מפורשים:
interface Person {
age: number
}
const filterByProp = function <T, K extends keyof T>(prop: K, value: T[K]) {
return function (item: T): boolean {
return item[prop] === value;
}
}
const people: Person[] = [{ age: 3}, { age: 2}];
const result = people.filter(filterByProp('age', 3))
people.filter(filterByProp('age', "3")) //error
people.filter(filterByProp('Age', 3)) //error
