首页 > 解决方案 > 导出的枚举/常量在同一文件中未定义

问题描述

过时的原始问题:

我对打字稿有很大的问题。我有一个包含导出常量、枚举和函数的文件(不是类)。

一些函数正在使用它自己的文件中定义的 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 时,它们在函数中是未定义的,那么在不使用类和初始化程序的情况下如何将它们定义到范围?

修复了调用 get 中的错误

更新:

抱歉,该错误仅由调试器呈现,它不了解底层实现。值得强调的是,如果我要创建一个内部 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);
    }

标签: typescripttypescript-3.6

解决方案


您的ultimateMeasuresLabelProvider功能不正确,实际上启用严格模式后它甚至无法编译。我不确定您到底想实现什么,但我最好的猜测是您希望通过提供一个值或一组值来获得一个或多个标签,并在UltimateMeasuresLabelsMap 对象中设置逗号。所以我不太明白这是怎么回事:如果你这样称呼它:.UltimateMeasuresUltimateMeasuresUltimateMeasuresLabels.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) || '';
}

请注意,您不必将密钥转换为字符串或类似的任何东西。


推荐阅读