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

Relaterade artiklar