• בלוג
  • כשאני יודע יותר מהמחשב

כשאני יודע יותר מהמחשב

02/05/2021

אחת הסיבות ש TypeScript מרגישה כמו בזבוז זמן היא שברוב המקרים אני חושב שאני יודע יותר מהמחשב. הנה קטע קוד פשוט לדוגמה:

interface IObject {
  a: number;
  b: number;
}

const o : IObject = { a: 10, b: 20 };
const k = JSON.parse('"a"');

console.log(o[k]);

זה קוד TypeScript שלא עובר קומפילציה למרות שאין בו אף טעות.

אני יודע שערך המשתנה k תמיד יהיה a, אבל המחשב לא יודע את זה עדיין. הוא עוד לא הריץ את JSON.parse ולכן לא יכול לדעת מה תהיה התוצאה שלו. זה נהיה יותר מסובך כשבמקום JSON.parse אני צריך ללכת לשרת להביא את הערך של מפתח מסוים.

ניסיון לקמפל את הקוד מקפיץ את השגיאה:

Element implicitly has an 'any' type because expression of type 'any' can't be used to index type 'IObject'.

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

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

  1. אפשר לבקש מ TypeScript שיעזוב אותי בשקט ולא ישמור על המשתנה o בכלל.

  2. אפשר להגיד ל TypeScript שאני יודע מה שאני עושה והתצואה של JSON.parse באמת הולכת להיות מפתח מתוך הממשק IObject.

הכיוון הראשון נראה כך ומתקמפל:

interface IObject {
  a: number;
  b: number;
}

const o : Record<string, any> = { a: 10, b: 20 };
const k = JSON.parse('"a"');

console.log(o[k]);

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

interface IObject {
  a: number;
  b: number;
}

const o : IObject = { a: 10, b: 20 };
const k: keyof IObject = JSON.parse('"a"');

console.log(o[k]);