typescript - Onko mahdollista käyttää enum-arvoja objektin avaimen arvona tyypin määrittelyssä?


Minulla on enum HealthPlanStatus, joka luotiin enum HealthPlanStatus-luokalla. Lopuksi haluaisin käyttää enumin avaimia ja arvoja luodakseni paitsi status-avaimia type IHealthPlanResponse-tyypille myös title-arvon enumin arvoina.

export enum HealthPlanStatus {
    Todo = 'To-Do',
    InProgress = 'Working on it',
}
export type IHealthPlanResponse = {
    [status in keyof typeof HealthPlanStatus]: {
        title: string;
    };
};

Se antaa minulle tiukan rakenteen, jossa minulla on status-avain enum-avaimena (Todo, InProgress...):

type IHealthPlanResponse = {
    readonly Todo: {
        title: string;
    };
    readonly InProgress: {
        title: string;
    };
}

Haluaisin myös, että minulla olisi title-tyyppi enum-arvoina. Esimerkiksi:

 type IHealthPlanResponse = {
    readonly Todo: {
        title: 'To-Do';
    };
    readonly InProgress: {
        title: 'Working on it';
    };
}

Vastaus #1

Sopiiko tämä sinulle?

export enum HealthPlanStatus {
    Todo = 'To-Do',
    InProgress = 'Working on it',
}
export type IHealthPlanResponse = {
    readonly [status in keyof typeof HealthPlanStatus]: {
        title: (typeof HealthPlanStatus)[status];
    };
};

let t: IHealthPlanResponse = {} as any
const status = t.InProgress.title   // -> HealthPlanStatus.InProgress

Jos et pidä siitä, että näet enum 'key' tässä ja haluat käyttää string-kirjainsanaa tyyppinä, voit vaihtaa sen tähän:

export type IHealthPlanResponse = {
    readonly [status in keyof typeof HealthPlanStatus]: {
        title: `${(typeof HealthPlanStatus)[status]}`;
    };
};

let t: IHealthPlanResponse = {} as any
const status = t.InProgress.title   // -> 'Working on it'

Vastaus #2

Upea lähestymistapa käyttää enumia yhden tyypin arvossa.

export enum selectedYearTypeValues {
    'currentYear',
    'All'
}

type Props = {
    selectedYear: keyof typeof selectedYearTypeValues;
    setSelectedYear: (value: keyof typeof selectedYearTypeValues) => void;
}