האם פונקציית Typescript יכולה להחזיר Promise כ-Promise?
אני יוצר עטיפה בטוחה-סוג עבור API של fetch, ושמתי לב שקומפיילר של TypeScript מסווג זאת כקוד תקני לגמרי:
function foo(response: Response): Promise<Bar> { //response received from a fetch() call
const json: Promise<any> = response.json();
return json; //Promise<any> can be returned as Promise<Bar>?
}
מדוע אפשר להחזיר ישירות Promise<any> כ-Promise<Bar>? האם זה לא אמור לדרוש איזשהו סוג של הצהרת טיפוס?
תשובה #1
תמיד הימנע מ-any. any בפני עצמו ניתן להקצות לכל דבר וניתן להקצות ממנו לכל דבר ללא שום סוג של בדיקות טיפוס. כאשר משתמשים בו כטיפוס גנרי, הטיפוס הנוצר (למשל Promise<any>) בדרך כלל יהיה ניתן להקצה לכל אינסטנציאציה אחרת עם כל טיעון טיפוס אחר במיקום זה (למשל Promise<Bar>).
מאז TypeScript 3.0 הוצג unknown (קראו כאן לעוד מידע) הדומה ל-any בכך שניתן להקצות לו כל דבר, הוא אינו ניתן להקצאה לכל דבר אחר ללא הצהרת סוג. לכן זהו שגיאה:
let u: Promise<unknown>
let n: Promise<number> = u; // error
אתה עשוי גם לבחון את חוקי tslint no-unsafe-any ו-no-any שמונעים שימוש ב-any בפרויקט, תלוי עד כמה אתה רוצה להרחיק עם איסור על any, וכמו שאמרתי בהתחלה אני הייתי אוסר אותו לחלוטין ומוסיף חריגות למקרים המעטים שבהם זה הכרחי לחלוטין.
תשובה #2
אם משהו יכול להיות anything הוא גם יכול להיות Bar. אם תסתכל על התיעוד של Typescript עבור סוגים בסיסיים זה אומר (הדגשה שלי)
כל
יתכן שנצטרך לתאר את סוגי המשתנים שאיננו יודעים כאשר אנו כותבים אפליקציה. ערכים אלו עשויים להגיע מתוכן דינמי, למשל מהמשתמש או מספרייה של צד שלישי. במקרים אלו, אנו רוצים להתנות עצמנו מבדיקת סוגים ולאפשר לערכים לעבור לבדיקה בזמן קומפילציה. לשם כך, אנו מתייגים אותם כסוג any:
מה שאומר שהסוג any מתעלם לחלוטין מבדיקות סוג בזמן הקומפילציה.
