בטייפסקריפט, למה אני חייב להגדיר את התכונה של מחלקה שהוגדרה כקריאה-רק?
יש לי את ההגדרה הבאה של מחלקה:
class Department
{
name: string;
id: string;
get prefix(): string
{
return !isNaN(parseFloat(this.id)) ? "n" : "i" ;
}
}
במקום אחר בקוד שלי, אני מנסה להשתמש בזה כך:
getDepartmentList(): Department[] {
return [
{
"name": "Dept 1",
"id": "1000"
}
];
}
עם זאת, אני מקבל את השגיאה הבאה:
סוג ' { "name": מחרוזת; "id": מחרוזת; } ' אינו ניתן להקצות לסוג 'Department'. המאפיין 'prefix' חסר בסוג '{ "name": מחרוזת; "id": מחרוזת; }'.
אני בטוח שהבעיה האמיתית היא החוסר שלי בהבנה של TypeScript, אבל מישהו יכול להסביר למה הקומפיילר רואה את פונקציית ה-getter כ-property ומצפה שאני אקבע לה ערך?
תשובה #1
המחלקה שלך Department יוצרת סוג Department. אתה מגדיר שהוא יכיל name, id ו-prefix. האובייקטים שאתה מחזיר ב-getDepartmentList אינם מכילים את ה-prefix, ולכן הם אינם תואמים מבחינה מבנית לסוג Department. לכן אתה מקבל שגיאה.
אני מניח שאתה מניח שהתכונה prefix תהיה זמינה על כל דבר שתצהיר שהוא מהסוג Department. זה לא המקרה, אין שום סוג של הקצאות מחלקה דינמיות כאלה ב-TypeScript. אתה צריך לוודא בעצמך שהאובייקטים שאתה אומר שהם סוג מסוים, אכן מממשים את הסוג הזה.
אתה יכול לעשות את זה משהו כזה:
class Department
{
constructor(public name:string, public id:string){ }
get prefix(): string
{
return !isNaN(parseFloat(this.id)) ? "n" : "i" ;
}
}
function getDepartmentList(): Department[]
{
return [new Department("Dept 1", "1000")];
}
כאן אתה יוצר מופעים חדשים מהמחלקה Department, ולכן לכל אותם מופעים תהיה תכונת prefix.
שימוש במזהה הגישה בחתימת הבנאי מורה ל-TypeScript ליצור משתנה עבור הפרמטר הזה, במקום להיחשב כארגומנט בלבד.
זה שקול ל:
class Department
{
name: string;
id:string;
constructor(name:string, id:string){
this.name = name;
this.id = id;
}
get prefix(): string
{
return !isNaN(parseFloat(this.id)) ? "n" : "i" ;
}
}
