экспортированный enum / const не определен в том же файле - PullRequest
0 голосов
/ 30 апреля 2020

Устаревший оригинальный вопрос:

У меня большая проблема с машинописью. У меня есть файл (не класс) с экспортированными константами, перечислениями и функциями.

Некоторые функции используют const и перечисления, определенные в самом файле. При отладке я обнаружил, что они не определены, что препятствует правильной работе функций.

Когда я получаю доступ к перечислениям и константам "извне", они работают как положено.

Вот один пример:

export enum UltimateMeasures {
    ULTIMATE_CARE_1 = 1500,
    ULTIMATE_CARE_2,
}

export const UltimateMeasuresLabels: Map<UltimateMeasures, string> = new Map([
    [UltimateMeasures.ULTIMATE_CARE_1, "Ultima foo"],
    [UltimateMeasures.ULTIMATE_CARE_2, "Ultima bar"],
]);

export function ultimateMeasuresLabelProvider(key: any): string {
    if (Array.isArray(key)) {
        const labels = [];
        for (const k of key) {
            labels.push(UltimateMeasuresLabels.get(k));
        }
        return labels.join(", ");
    }
    return UltimateMeasuresLabels.get(key);
}

console.log(ultimateMeasuresLabelProvider(UltimateMeasures.ULTIMATE_CARE_1));

Когда я использую UltimateMeasures из другого модуля, они инициализируются, когда я вызываю ultimateMeasuresLabelProvider, они не определены внутри функции, так что я могу сделать, чтобы сделать они определены для областей без использования классов и инициализаторов?

исправлена ​​ошибка в вызове для получения

ОБНОВЛЕНИЕ:

Извините, но ошибка была представлена ​​только отладчиком , который не знал о базовой реализации. Интересно отметить, что если бы я создал внутреннее const awareOfUltimateMeasuresLabels и указал его на экспортированный UltimateMeasuresLabels, то и отладчик работал бы так, как предполагалось.

Спасибо за ответы, я оставляю это здесь на случай, если кто-то еще столкнется с той же ситуацией, чтобы дать надежду, что в конце это сработает:)

export function ultimateMeasuresLabelProvider(key: any): string {
        const awareOfUltimateMeasuresLabels = UltimateMeasuresLabels;
        if (Array.isArray(key)) {
            const labels = [];
            for (const k of key) {
                labels.push(awareOfUltimateMeasuresLabels.get(k));
            }
            return labels.join(", ");
        }
        return awareOfUltimateMeasuresLabels.get(key);
    }

1 Ответ

0 голосов
/ 30 апреля 2020

Ваша функция ultimateMeasuresLabelProvider неверна, фактически при включенном строгом режиме она даже не скомпилируется. Я не уверен, чего именно вы пытаетесь достичь, но я бы предпочел, чтобы вы хотели объединить одну или несколько меток с запятой в объекте UltimateMeasuresLabels Map, указав значение UltimateMeasures или массив *. 1004 * значения. Так что я не совсем понимаю, что с этим: UltimateMeasuresLabels.get(UltimateMeasures[String(k)]), если вы затем называете это так: ultimateMeasuresLabelProvider(UltimateMeasures.ULTIMATE_CARE_1).

В любом случае эта функция, скорее всего, исправит ваши проблемы:

function ultimateMeasuresLabelProvider(key: UltimateMeasures | UltimateMeasures[]): string {
    if (Array.isArray(key)) {
        const labels: string[] = [];
        for (const k of key) {
            const label = UltimateMeasuresLabels.get(k);
            if (label) labels.push(label);
        }
        return labels.join(", ");
    }
    return UltimateMeasuresLabels.get(key) || '';
}

Обратите внимание, что вам не нужно делать никаких магов c с преобразованием ключа в строку или чем-то подобным.

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