Typescript: Gör typ beroende av värdet på variabeln


Jag har följande kod:

interface ObjectWithLorem {
    lorem: string;
}

interface ObjectWithIpsum {
    ipsum: string;
}

type KeyName = 'lorem' | 'ipsum';

const key: KeyName = 'lorem';

type Object = key === 'lorem' ? ObjectWithLorem : ObjectWithIpsum;

const object: Object = {
    lorem: 'Lorem'
}

Lekplatslänk

Detta fungerar uppenbarligen inte, men jag undrade om det fanns ett sätt att få det att fungera som det är, eller åtminstone en alternativ lösning för att uppnå samma effekt - i huvudsak bör Object-typen vara antingen ett ObjectWithLorem eller ett ObjectWithIpsum-interface, beroende på om key-variabeln är lorem eller inte.

Svar #1

Om vi har våra nycklar och gränssnitt, låt oss kartlägga varje nyckel till motsvarande gränssnitt:

type KeyToInterfaceMap = {
    lorem: ObjectWithLorem;
    ipsum: ObjectWithIpsum;
};

Sedan använder vi en mappad typ för att få våra möjliga tupler:

type PossibleTuples = {
    [K in keyof KeyToInterfaceMap]: [K, KeyToInterfaceMap[K]];
}[keyof KeyToInterfaceMap];

Säg nu om du har en variabel av typen PossibleTuples, kanske så här:

declare const checkMe: PossibleTuples;

Vi kan göra vad du vill precis så här:

const [key, obj] = checkMe;

if (key === "lorem") {
    obj // inferred as ObjectWithLorem
}

Du kan utforska mer med denna metod nedan:

Lekplats