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

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

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

טייפסקריפט - טייפ מותנה

מתוזמן נעוץ נעול הועבר תכנות
13 פוסטים 3 כותבים 318 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • צדיק תמיםצ מנותק
    צדיק תמיםצ מנותק
    צדיק תמים
    כתב ב נערך לאחרונה על ידי צדיק תמים
    #1

    יש לי ספריית JavaScript שאני מתחזק, ואני רוצה ליצור קובץ טייפים (index.d.ts) עבור מי שרוצה להשתמש בה עם TypeScript.
    נתקלתי בבעיה - פונקציה שמקבלת שני ארגומנטים, והטייפ של הארגומנט השני משתנה לפי הפרמטר הראשון.

    דוגמה מופשטת:

    function doSomething (mode, data) {
        if (mode == 'add') {
            const { num } = data;
            return num + 1;
        } else if (mode == 'upper') {
            const { str } = data;
            return str.toUpperCase();
        }
    }
    

    הפונקציה מקבלת פרמטר mode ואובייקט data,
    אם הפרמטר הראשון (mode) הוא add אז השני (data) צריך להיות אובייקט עם פרופרטי num, ואם הפרמטר mode הוא upper אז data צריך להיות אובייקט עם פרופרטי str.
    אני לא רוצה לשלב את הארגומנטים לאובייקט אחד של mode ו-data, מכיוון שזה ישבור הרבה מאוד קוד קיים.

    לא הצלחתי למצוא מידע רלוונטי בגוגל, האם זה אפשרי בכלל?
    אשמח לעזרה, תודה מראש.

    Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
    טיפים

    תגובה 1 תגובה אחרונה
    0
    • dovidD מחובר
      dovidD מחובר
      dovid ניהול
      כתב ב נערך לאחרונה על ידי dovid
      #2

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

      function doSomething (mode: string, data: {num: number, str: string}) {
      
      צדיק תמיםצ תגובה 1 תגובה אחרונה
      1
      • צדיק תמיםצ מנותק
        צדיק תמיםצ מנותק
        צדיק תמים
        השיב לdovid ב נערך לאחרונה על ידי צדיק תמים
        #3

        @dovid כתב בטייפסקריפט - טייפ מותנה:

        הכי פשוט זה לעשות משתנה על שמתאים לשני המקרים, למשל במקרה שלך ככה:

        הבעיה שזה מוריד הרבה מהערך של הטייפים, כי אני לא רוצה שהטייפ של הdata יהיה אובייקט גדול עם כמה פורפרטי'ס אופציונליים, אלא שהטייפ יהיה אובייקט בדיוק עם מה שאפשר להעביר, ואז אם מעבירים לdata פרופרטי שלא מתאים לmode שנבחר טייפסקריפט יתריע מיד.

        Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
        טיפים

        תגובה 1 תגובה אחרונה
        0
        • dovidD מחובר
          dovidD מחובר
          dovid ניהול
          כתב ב נערך לאחרונה על ידי
          #4

          סליחה, אני רואה שזה אפשרי
          https://stackoverflow.com/questions/61734515/typescript-second-parameter-params-type-based-on-first-parameter
          הדוגמה שמה ממחישה זאת, עוד לא הבנתי איך.

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

            @dovid
            לקחתי את הדוגמה הזו ובניתי ממנה את זה:
            https://www.typescriptlang.org/play?#code/C4TwDgpgBAsiAq5oF4oG8CwAoKUCGAJgQFzoB2ArgLamVUBGEATgL4A0U2uFYkTpaAM7B+UYUwCWZAOYtsLANzYAZhTIBjYBID2ZKAW0BlbVQjAAFlOkAeeFAgAPYBDIFBUANYQQ25bARIHADS9k4ubv6IkADa8AC6AHwAFFTaBBCk8BwEeMB4pEEAlFAFUAA+UGrpylIQBOhcuFASfilpKKgA5IQEncWYOE1D6rrC6FB0UCxQqDl5SoNDuExmFEx6kwDUUACMC0PTEAA2gtAtUG3pM108fH0Ni0sjZGNoYiJTM-q5ePtLy6t1u8mAA6YDaACqvGYAGE8KckoU-rg5I8VsA1mQFqiDMZTBYrElukROhw0HRSDsWEjsLiTGZLDIibdmKT0OJSJ0dgAmADMnWpCzp+MZ0iJPP5ZI5UC5fIFNKwwoZhOJvSlIk5EvlCyAA

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

            (כרגע מה שיש לי להציע זה להוסיף המרות בתוך הפונקציה, אבל זה לא יפה).

            צדיק תמיםצ 2 תגובות תגובה אחרונה
            1
            • dovidD מחובר
              dovidD מחובר
              dovid ניהול
              כתב ב נערך לאחרונה על ידי
              #6
              פוסט זה נמחק!
              חגיח תגובה 1 תגובה אחרונה
              1
              • חגיח מנותק
                חגיח מנותק
                חגי
                השיב לdovid ב נערך לאחרונה על ידי
                #7
                פוסט זה נמחק!
                תגובה 1 תגובה אחרונה
                1
                • צדיק תמיםצ מנותק
                  צדיק תמיםצ מנותק
                  צדיק תמים
                  השיב לחגי ב נערך לאחרונה על ידי צדיק תמים
                  #8

                  @חגי כתב בטייפסקריפט - טייפ מותנה:

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

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

                  Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                  טיפים

                  תגובה 1 תגובה אחרונה
                  1
                  • dovidD מחובר
                    dovidD מחובר
                    dovid ניהול
                    כתב ב נערך לאחרונה על ידי
                    #9
                    פוסט זה נמחק!
                    תגובה 1 תגובה אחרונה
                    1
                    • dovidD מחובר
                      dovidD מחובר
                      dovid ניהול
                      כתב ב נערך לאחרונה על ידי dovid
                      #10

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

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

                        @dovid כתב בטייפסקריפט - טייפ מותנה:

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

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

                        Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                        טיפים

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

                          @חגי @חגי תודה רבה, שילבתי בקוד שלי ועובד מעולה!
                          אבל משום מה האכיפה היא רק כל עוד חסרים פרופרטי'ס, אבל אם יש התאמה ואני רק מוסיף פרופרטי נוסף שלא מוגדר - אין שגיאה...
                          דוגמה (בשתי הדוגמאות בסוף אמור להיות שגיאה)

                          עוד משהו שהייתי רוצה לשפר - באחד מהסטים של הdata יש פרופרטי אופציונלי של ערך ברירת מחדל, אני רוצה שהערך החזרה של הפונקציה יהיה או סטרינג - או הפרופרטי האופציונלי, אבל במידה ולא הועבר הפרופרטי, או בmode שבו הפרופרטי לא קיים, הערך החזרה יהיה סטרינג קשיח
                          מצורף דוגמה

                          Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                          טיפים

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

                            @צדיק-תמים
                            אופס 🙂
                            https://www.typescriptlang.org/play?#code/C4TwDgpgBAsiAq5oF4oG8CwAoKuoEMATQgLnSgDsBXAWzOpoCMIAnKAXwBps8oqxILMmigBnYELESAlhQDmHbOwDc2AGZUKAY2DSA9hSiE9AZT00IwABay5AHnhQIAD2AQKhUVADWEEHrVYBCQAPgAKGj1CCDJ4TiN8YHwyOERIAG14AF0ASjJxFlsoAB8+Dwg1WQhCdB48AHp6qGlAiKiUVAByIkJOnNqcBqbeLQNxcgYOKFRCRPxVQdxG3igWSyoWQ0mAaigARgXeZfYnABtRaBaoNujprv5BPoGj4bxRinGRAqmZucOhlZrYAbQwFAB0wD0AFUBKwAML4C5hHL-JZNdh1XBAkELDFYbDGMwWay2MLdYideIiNT4XxkPYcFEE0zmSw2eRknqUia0enxGl0qAAJkZCyAA

                            תגובה 1 תגובה אחרונה
                            3

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

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

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