Initiera tomt objekt i TypeScript med Record-typ
Hur man definierar och initialiserar ett objekt som kan vara tomt.
Med typer
type Plan = 'plan1' | 'plan1';
interface IPlan {
name: string
}
När jag försökte initiera ett tomt objekt får jag ett fel
const plans: Record<Plan, Readonly<IPlan> = {}; // **ERROR HERE**
plans.plan1 = {
name: 'Plan #1'
}
Egenskapen 'plan1' saknas i typen '{}' men krävs i typen 'Record<"plan1", Readonly>'.
Lekyta
Svar #1
Använd helt enkelt Partial-verktygstypen: Partial<Type>
type Plan = 'plan1' | 'plan1';
interface IPlan {
name: string
}
const plans: Partial<Record<Plan, IPlan>> = {}; // no error
plans.plan1 = {
name: 'Plan #1'
}
Nackdelen med detta tillvägagångssätt är att nu är alla egenskaper i ditt gränssnitt valfria. Men eftersom du vill att det ska kunna skapas utan den obligatoriska egenskapen, är det det enda sättet.
Lekplatslänk
En annan idé kan vara att använda Omit-verktygs typen: Omit<Type, Keys>
interface Plan {
name: string;
}
type IPlan = Omit<Plan , "name">;
const plans: IPlan = {};
Så, återigen, du kan instansiera utan de obligatoriska egenskaperna.
Lekplatslänk
Svar #2
Du skulle kunna göra något som:
type Plan = 'plan1' | 'plan2';
interface IPlan {
name: string
}
type PlansRecord = Record<Plan, Readonly<IPlan>>
const plansRecord = {} as PlansRecord
console.log({plansRecord})
Output: [LOG]: { "plansRecord": {} }
Demo
