Убедитесь, что prop является значением от константы - TS - PullRequest
0 голосов
/ 20 марта 2020

У меня есть const в библиотеке (план js).

export const Intent = {
    NONE: "none" as "none",
    PRIMARY: "primary" as "primary",
    SUCCESS: "success" as "success",
    WARNING: "warning" as "warning",
    DANGER: "danger" as "danger",
};
export type Intent = typeof Intent[keyof typeof Intent];

Я хочу убедиться, что мой реквизит, который я получаю от родителей, имеет только одно из 5 ключевых значений Intent , Как мне продолжить это? Пожалуйста, совет.

Это то, что я сделал до сих пор.

interface Props {
  exportButtonColor?: [keyof typeof Intent];
}

Любая помощь очень ценится.

1 Ответ

1 голос
/ 20 марта 2020

Если у какого-то очень умного человека нет лучшего решения, это должно сработать:

const Intent = {
    NONE: "none" as "none",
    PRIMARY: "primary" as "primary",
    SUCCESS: "success" as "success",
    WARNING: "warning" as "warning",
    DANGER: "danger" as "danger",
};
type Intent = typeof Intent[keyof typeof Intent];

const Classes = {
    INTENT_PRIMARY: "foobar",
    INTENT_NONE: "barfoo",
    INTENT_SUCCESS: "somecssclass",
    INTENT_WARNING: "you get the idea",
    INTENT_DANGER: "will robinson",
};

type IntentKey = keyof typeof Intent;

const KeyMap: {
    [key in IntentKey]: keyof typeof Classes
} = {
    PRIMARY: "INTENT_PRIMARY",
    NONE: "INTENT_NONE",
    SUCCESS: "INTENT_SUCCESS",
    WARNING: "INTENT_WARNING",
    DANGER: "INTENT_DANGER",
}

function test({ color }: { color: IntentKey }) {
    return Classes[KeyMap[color]];
}

Обратите внимание, что это безопасность типов за счет явного отображения.

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...