דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. getTime אינו פונקציה

getTime אינו פונקציה

מתוזמן נעוץ נעול הועבר תכנות
23 פוסטים 6 כותבים 740 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yyyY מנותק
    yyyY מנותק
    yyy
    כתב ב נערך לאחרונה על ידי
    #1

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

    setAge(BirthDate:Date)  {
      var ageDifMs = Date.now() - BirthDate.getTime();   
      var ageDate = new Date(ageDifMs); // miliseconds from epoch
      return Math.abs(ageDate.getUTCFullYear() - 1970);
    }
    

    בדקתי ואכן הפונקציה מחזירה Number של הגיל.

    אני צריך לעדכן מידי פעם גילאים שהשתנו ולשם כך אני קורא לפונקציה הבאה:

    updateAllAges(){
        for (let i = 0; i < this.DB.length; i++) {
          this.DB[i].Age =DBtype.setAge(this.DB[i].BirthDate);
        }
      }
    

    כאשר setAge היא פונקציה שהובאה למעלה, אלא שהפכתי אותה לסטטית ומשויכת למחלקה DBtype.

    הוספתי לכפתור את ה-Click הבא:

    <button (click)="updateAllAges() type="button">Click Me!</button>
    
    

    ברמת הקומפילציה הכל עובד חלק (אנגולר), אבל כאשר אני משנה את התאריך ולוחץ על הכפתור אני מקבל בקונסול של הדפדפן את השגיאה הבאה:

    core.js:6456 ERROR TypeError: BirthDate.getTime is not a function
        at Function.setAge (myFile.ts:3)
    

    שאלתי היא למה getTime אינו פונקציה, וכיצד ניתן לפתור זאת?
    תודה רבה לחברי האתר הנהדרים.

    רפאלר תגובה 1 תגובה אחרונה
    0
    • רפאלר מנותק
      רפאלר מנותק
      רפאל
      השיב לyyy ב נערך לאחרונה על ידי רפאל
      #2

      @yyy למיטב הבנתי this.DB מייצג מערך של אובייקטים שמקורם במסד נתונים כלשהו ושמכך ניתן להניח שthis.DB[i].BirthDate מייצג תאריך בפורמט JSON.
      כדי לעשות שימוש במתודות שנמצאות בPrototype של Date, נדרשת תחילה המרה של התאריך שמיוצג כString לאובייקט מסוג Date.

      yyyY תגובה 1 תגובה אחרונה
      3
      • yyyY מנותק
        yyyY מנותק
        yyy
        השיב לרפאל ב נערך לאחרונה על ידי
        #3

        @רפאל
        איפה ראית String?

        רפאלר תגובה 1 תגובה אחרונה
        0
        • רפאלר מנותק
          רפאלר מנותק
          רפאל
          השיב לyyy ב נערך לאחרונה על ידי רפאל
          #4

          @yyy על מנת להוכיח שאני טועה (כתמיד) נסה להוסיף את השורה הבאה לקוד, ווודא שהתוצאה שלילית.

          console.log(typeof this.DB[0].BirthDate === 'string')
          
          OdedDvirO yyyY 2 תגובות תגובה אחרונה
          2
          • OdedDvirO מנותק
            OdedDvirO מנותק
            OdedDvir
            השיב לרפאל ב נערך לאחרונה על ידי
            #5

            @רפאל כמה שאני מנסה להתאפק ולהמתין לתשובתו של @yyy , עדיין לא הבנתי איך השגיאה עוברת את ה Casting בהשמה לארגומנט של הפונקציה, שהוא מסוג Date. ורק אחר כך נזכרת להתעורר, ולהזכר ש BirthtDate הוא string?

            רפאלר תגובה 1 תגובה אחרונה
            3
            • רפאלר מנותק
              רפאלר מנותק
              רפאל
              השיב לOdedDvir ב נערך לאחרונה על ידי
              #6

              @odeddvir איש #C שכמוך.

              OdedDvirO תגובה 1 תגובה אחרונה
              3
              • OdedDvirO מנותק
                OdedDvirO מנותק
                OdedDvir
                השיב לרפאל ב נערך לאחרונה על ידי OdedDvir
                #7

                @רפאל אמר בgetTime אינו פונקציה:

                @odeddvir איש #C שכמוך.

                הייתה לי הרגשה שזה קשור לתוהו ובוהו של JS.
                אבל בכל זאת, אשמח להסבר כלשהו, בפרט שמדובר ככל הנראה ב TypeScript.

                רפאלר רחמיםר 2 תגובות תגובה אחרונה
                2
                • רפאלר מנותק
                  רפאלר מנותק
                  רפאל
                  השיב לOdedDvir ב נערך לאחרונה על ידי רפאל
                  #8

                  @odeddvir ההצהרה על הסוג של BirthDate כDate מייצגת את התחביר של TypeScript, אשר נועדה לשפר את חויית הכתיבה, אולם בזמן הריצה אין כלל הצהרה על הסוג של הפרמטר.

                  OdedDvirO תגובה 1 תגובה אחרונה
                  3
                  • OdedDvirO מנותק
                    OdedDvirO מנותק
                    OdedDvir
                    השיב לרפאל ב נערך לאחרונה על ידי OdedDvir
                    #9

                    @רפאל אוף!!
                    אני מוכן לקבל את הרעיון ש TS בסך הכל נועדה לפתור חלק מהבעיות בזמן הכתיבה, ושבזמן הריצה אנחנו עדיין במערב הפרוע של JS, אבל בכל זאת הודעת השגיאה הייתה מטעה אותי, ומסתמא הייתי שובר את הראש זמן רב עד שהייתי קולט את הבעיה, TS רק גורמת להסתיר עוד יותר את השגיאה...

                    רפאלר תגובה 1 תגובה אחרונה
                    5
                    • רפאלר מנותק
                      רפאלר מנותק
                      רפאל
                      השיב לOdedDvir ב נערך לאחרונה על ידי רפאל
                      #10

                      @odeddvir למה אתה סבור שלTypeScript יש חלק בהסתרת השגיאה?

                      OdedDvirO תגובה 1 תגובה אחרונה
                      0
                      • OdedDvirO מנותק
                        OdedDvirO מנותק
                        OdedDvir
                        השיב לרפאל ב נערך לאחרונה על ידי OdedDvir
                        #11

                        @רפאל כי היא מטעה אותי לחשוב לפי הצהרת הפונקציה שגם בזמן ריצה Birthdate הוא Date, בעוד שהוא בעצם string, ולחשוב שהשגיאה לא קשורה ל typing.

                        מוטי אורןמ רפאלר 2 תגובות תגובה אחרונה
                        2
                        • מוטי אורןמ מנותק
                          מוטי אורןמ מנותק
                          מוטי אורן
                          השיב לOdedDvir ב נערך לאחרונה על ידי
                          #12

                          @odeddvir הענין הזה הוא אחד הדברים שמפריעים לי במיוחד ב-TS. כלומר, הוא מאוד עוזר לך לשלוט בקוד שאתה כותב (כשאני כותב TS, הקוד באמת יותר מסודר לי בראש בצורה די משמעותית), אבל מצד שני, כשאתה עובר לעולם המעשה אתה צריך באמת לשים לב טוב מאוד שאתה לא משתמש בקוד באופן לא תקין (הדוגמה למעלה ממחישה זאת היטב), שאז מנגנון ה-Types והקומפילציה לא ממש עוזר.

                          תגובה 1 תגובה אחרונה
                          5
                          • רפאלר מנותק
                            רפאלר מנותק
                            רפאל
                            השיב לOdedDvir ב נערך לאחרונה על ידי רפאל
                            #13

                            @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))
                              }
                            }
                            
                            תגובה 1 תגובה אחרונה
                            5
                            • yyyY מנותק
                              yyyY מנותק
                              yyy
                              השיב לרפאל ב נערך לאחרונה על ידי yyy
                              #14

                              @רפאל אמר ב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.
                              בקיצור בלגן.
                              איך מתקדמים?

                              רפאלר תגובה 1 תגובה אחרונה
                              0
                              • רפאלר מנותק
                                רפאלר מנותק
                                רפאל
                                השיב לyyy ב נערך לאחרונה על ידי
                                #15

                                @yyy נסה לבצע את המשימה כך

                                Date.now() - new Date(BirthDate).getTime
                                
                                yyyY תגובה 1 תגובה אחרונה
                                4
                                • yyyY מנותק
                                  yyyY מנותק
                                  yyy
                                  השיב לרפאל ב נערך לאחרונה על ידי
                                  #16

                                  @רפאל תודה רבה איש מקצוען.

                                  רפאלר תגובה 1 תגובה אחרונה
                                  0
                                  • רפאלר מנותק
                                    רפאלר מנותק
                                    רפאל
                                    השיב לyyy ב נערך לאחרונה על ידי
                                    #17

                                    @yyy הפניתי את ראשי אנה ואנה לראות את מי כינית מקצוען.

                                    yyyY תגובה 1 תגובה אחרונה
                                    3
                                    • yyyY מנותק
                                      yyyY מנותק
                                      yyy
                                      השיב לרפאל ב נערך לאחרונה על ידי
                                      #18

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

                                      תגובה 1 תגובה אחרונה
                                      1
                                      • רחמיםר מנותק
                                        רחמיםר מנותק
                                        רחמים מורחק
                                        השיב לOdedDvir ב נערך לאחרונה על ידי
                                        #19

                                        @odeddvir אמר בgetTime אינו פונקציה:

                                        הייתה לי הרגשה שזה קשור לתוהו ובוהו של JS

                                        @odeddvir אמר בgetTime אינו פונקציה:

                                        ושבזמן הריצה אנחנו עדיין במערב הפרוע של JS

                                        👍

                                        dovidD תגובה 1 תגובה אחרונה
                                        0
                                        • dovidD מנותק
                                          dovidD מנותק
                                          dovid ניהול
                                          השיב לרחמים ב נערך לאחרונה על ידי dovid
                                          #20

                                          @רפאל סתם להחכים, הרי תיאורטית TypeScript יכלו לייצר קוד JS טהור שבודק התאמה לטיפוס (אולי זה יקר מבחינת ביצועים) וזורק שגיאה, זה לא הפואנטה של TS בכלל, או שיש מקרים שהקו'ד המיוצר נותן טיפה קשיחות ביחס לקוד JS רגיל (נפקא מינה בדיוק למקרים כאלה שההודעות שגיאה יהיו חכמות יותר)?

                                          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                                          בכל נושא אפשר ליצור קשר dovid@tchumim.com

                                          רפאלר תגובה 1 תגובה אחרונה
                                          2

                                          • 1
                                          • 2
                                          בא תתחבר לדף היומי!
                                          • התחברות

                                          • אין לך חשבון עדיין? הרשמה

                                          • התחברו או הירשמו כדי לחפש.
                                          • פוסט ראשון
                                            פוסט אחרון
                                          0
                                          • דף הבית
                                          • קטגוריות
                                          • פוסטים אחרונים
                                          • משתמשים
                                          • חיפוש
                                          • חוקי הפורום