-
@yyy למיטב הבנתי
this.DB
מייצג מערך של אובייקטים שמקורם במסד נתונים כלשהו ושמכך ניתן להניח שthis.DB[i].BirthDate
מייצג תאריך בפורמט JSON.
כדי לעשות שימוש במתודות שנמצאות בPrototype של Date, נדרשת תחילה המרה של התאריך שמיוצג כString לאובייקט מסוג Date. -
@רפאל אוף!!
אני מוכן לקבל את הרעיון ש TS בסך הכל נועדה לפתור חלק מהבעיות בזמן הכתיבה, ושבזמן הריצה אנחנו עדיין במערב הפרוע של JS, אבל בכל זאת הודעת השגיאה הייתה מטעה אותי, ומסתמא הייתי שובר את הראש זמן רב עד שהייתי קולט את הבעיה, TS רק גורמת להסתיר עוד יותר את השגיאה... -
@odeddvir הענין הזה הוא אחד הדברים שמפריעים לי במיוחד ב-TS. כלומר, הוא מאוד עוזר לך לשלוט בקוד שאתה כותב (כשאני כותב TS, הקוד באמת יותר מסודר לי בראש בצורה די משמעותית), אבל מצד שני, כשאתה עובר לעולם המעשה אתה צריך באמת לשים לב טוב מאוד שאתה לא משתמש בקוד באופן לא תקין (הדוגמה למעלה ממחישה זאת היטב), שאז מנגנון ה-Types והקומפילציה לא ממש עוזר.
-
@odeddvir ניתן לטפל בעניין ע"י שימוש נכון בתחביר.
אפשרות אחת היא שימוש בUnion type, לדוגמא string | Date מייצג ערך שיכול להיות Date או String.
interface Person { name: string; dob: string | Date; }
Union type מאפשר לך לגשת למאפיינים שמשותפים לכל הסוגים המרכיבים את הUnion ללא כל בעיה, אולם כדי לגשת למאפייינים היחודיים לאחד מהסוגים המרכיבים את הUnion נדרשת המרה של הUnion לסוג הספיציפי הדרוש ע"י בדיקת JS שהסוג אכן תואם והמהדר של Typescript ידייק וישנה את הסוג המוצהר (הUnion) לסוג הספיציפי, לדוגמא:
person.dob.getDay() // Error: getDay does not exist on type string if (typeof person.dob === 'object') { person.dob.getDay() // Date בתוך התנאי הסוג הוא }
דרך נוספת היא ליצור שני מודלים, הראשון יייצג את הערך היוצא לשרת (Outbound), והשני יייצג את הערך שחוזר מהשרת (Inbound) לדוגמא:
interface PersonBase { name: string; } interface ResponsePerson extends PersonBase { dbo: string; } class Person implements PersonBase { constructor(public name: string, public dbo: Date) { } public static fromPersonResponse({ name, dbo }: ResponsePerson): Person { return new Person(name, new Date(dbo)) } }
-
@רפאל אמר בgetTime אינו פונקציה:
@yyy על מנת להוכיח שאני טועה (כתמיד) נסה להוסיף את השורה הבאה לקוד, ווודא שהתוצאה שלילית.
console.log(typeof this.DB[0].BirthDate === 'string')
זה מחזיר true.
אני מבין שהשגיאה היא בשורה
var ageDifMs = Date.now() - BirthDate.getTime();
בכדי לנסות לפתור את הבעיה
עשיתי את הדבר הבאvar ageDifMs = Date.now() - JSON.parse(BirthDate).getTime();
בקיצור להפוך את זה לאובייקט.
הבעיה שכאן כבר יש שגיאה שהטייפ לא מתאים:Argument of type 'Date' is not assignable to parameter of type 'string'
כי הצהרתי שזה Date, ועכשיו אני מתייחס לזה כ-string.
בקיצור בלגן.
איך מתקדמים? -
@odeddvir אמר בgetTime אינו פונקציה:
הייתה לי הרגשה שזה קשור לתוהו ובוהו של JS
@odeddvir אמר בgetTime אינו פונקציה:
ושבזמן הריצה אנחנו עדיין במערב הפרוע של JS
-
@רפאל סתם להחכים, הרי תיאורטית TypeScript יכלו לייצר קוד JS טהור שבודק התאמה לטיפוס (אולי זה יקר מבחינת ביצועים) וזורק שגיאה, זה לא הפואנטה של TS בכלל, או שיש מקרים שהקו'ד המיוצר נותן טיפה קשיחות ביחס לקוד JS רגיל (נפקא מינה בדיוק למקרים כאלה שההודעות שגיאה יהיו חכמות יותר)?
-
@dovid התשובה שלילית, הקוד המיוצר זהה כמעט לחלוטין למקור, למעט מקרים ספורים (למשל הOptional operator לפני שהיה זמין בJS).
מאמר שהתפרסם בNCC Group תחת הכותרת:
?Does TypeScript Offer Security Improvements Over JavaScript
קובע באופן נחרץ:מה אנחנו מרוויחים מהשימוש ב-TypeScript מבחינת בטיחות? התשובה היא אפס. למעשה אם כבר, השימוש בTypeScript רק גורע מהבטיחות מכיוון שהוא מעניק לנו תחושת שווא של טיפוסיות קשוחה ובדיקת סוגים שלא קיימות בפועל בזמן הריצה.
שימושית כל שתהיה בזמן הכתיבה, אין שום יתרון לשימוש בזמן הריצה.