TypeScript - הגדר מצב של Pinia בהתבסס על ממשק מבלי ליצור כל תכונה מחדש באופן ידני


אני מנסה ליישם ניהול מצב (pinia) ב-SPA. אנחנו משתמשים ב-Typescript ואני תוהה אם יש דרך להגדיר מצב המבוסס על ממשק (interface) מבלי הצורך להקליד שוב כל נושא בנפרד במצב. בעצם, לומר למצב שהוא מבוסס על ממשק והוא מאותחל עם המבנה הנכון.

אני יכול להגדיר state כדי לעקוב אחרי מבנה interface מסוים באמצעות defineStore<string, MyInterface> (שזה כבר ניצחון גדול) אבל אני תוהה אם אפשר לעקוב אחרי הקונספט של spread operator כדי להימנע מלחכות את כל התכונות של ה-interface בהצהרת ה-state.

דוגמה רעיונית

interface ICustomer {
    id: number;
    name: string;
    // up to 100 more properties and in some cases, nested objects based on other interfaces
}

export const useCustomersStore = defineStore<string, ICustomer>('customers', {
    state: () => ({
        ...ICustomer,
    }),
...

יש לנו ממשקים די גדולים (אני מדבר על בין 50 ל-100 תכונות בכל אחד) ואם אנחנו צריכים להקליד כל תכונה שוב במצב זה יכול להיות קצת ארוך. אני מניח שהבעיה העיקרית היא שהמצב צריך ערך ברירת מחדל כדי להיות מאופס, אבל אם אנחנו צריכים להקליד את כל התכונות שוב זה יהפוך את העניינים למעט מבולגן יותר. בנוסף, זה לא מאוד עמיד לעתיד אם נצטרך לזכור לשנות את תכונות המצב אם נשנה את הממשקים. ה-APIs שלנו תמיד מתאימים בדיוק למבנה הממשק, אז אנחנו משתמשים ב-axios ומציינים את הממשק בכל קריאה גם כן.

תודה

תשובה #1

אתה יכול לעשות את זה:

interface ICustomer {
    id: number;
    name: string;
    // up to 100 more properties and in some cases, nested objects based on other interfaces
}

export const useCustomersStore = defineStore('customers', {
    state: (): ICustomer => ({

    }),
    ...