טיפ טייפסקריפט: יבוא קבצי JSON גדולים
לטייפסקריפט יש פיצ'ר ממש חמוד לעבודה עם קבצי JSON שנקרא resolveJsonModule. אנחנו מגדירים ב tsconfig.json את האופציה באופן הבא:
{
"compilerOptions": {
"resolveJsonModule": true,
"esModuleInterop": true
},
"include": ["src"]
}
ואז כותבים:
import settings from './settings.json';
ובאופן אוטומטי טייפסקריפט קורא את הקובץ settings.json, מזהה לבד את טיפוס הנתונים בקובץ ומגדיר את האוביקט settings בצורה נכונה, כלומר אם הקובץ שלי מכיל את התוכן:
[{
"repo": "TypeScript",
"dry": false,
"debug": false
}]
ואני אנסה לכתוב בקוד:
import settings from './settings.json';
console.log(settings[0].foo);
טייפסקריפט יצעק שאין מאפיין foo לאוביקטים במערך. קסם נכון? כמעט. הבעיה מתחילה כשמנסים לטעון אוביקט JSON גדול, למשל 10 מגה. קובץ כזה מאט את כל ה VS Code ובסוף טייפסקריפט לא מצליח לקרוא אותו כי הוא גדול מדי ואנחנו תקועים בלי הגדרת טיפוסים.
בעבודה עם קבצי JSON גדולים שווה להכיר את האופציה allowArbitraryExtensions של טייפסקריפט, אופציה שבעזרתה נוכל להגדיר את הטיפוס של ה JSON ידנית, נחסוך לטייפסקריפט עבודה וכך נקבל VS Code מהיר יותר והגדרות טיפוסים אמינות. ה tsconfig.json נראה ככה:
{
"compilerOptions": {
"allowArbitraryExtensions": true,
"resolveJsonModule": true,
"esModuleInterop": true
},
"include": ["src"]
}
ובתיקיית src אנחנו יוצרים קובץ בשם של ה json אבל עם d באמצע וסיומת ts, לדוגמה אם ל json שלי קוראים deposits.json
אז אני יוצר קובץ בשם deposits.d.json.ts
. בקובץ הגדרת הטיפוס אני כותב:
export interface SavingsData {
INTERESTSDATE: string;
SAVINGSPROGRAMBYAGE: string;
AGE: string;
BANK: string;
SAVINGSPLAN: string;
SAVINGSPERIOD: string;
FIXEDWITHOUTLINKAGEVAL: number;
FIXEDLINKEDCONSUMERPRICEINDVAL: number;
VARIABLESPREAD: number;
}
declare const array: Array<SavingsData>;
export default array;
ומפה אנחנו מסודרים. אפשר לייבא את הקובץ deposits.json אפילו שהוא שוקל 10 מגה וטייפסקריפט ישתמש בהגדרת הטיפוס שבנינו במקום לקרוא את הקובץ ולנסות להבין את הטיפוס לבד.