首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Typescript认为我的枚举是未定义的?

问为什么Typescript认为我的枚举是未定义的?
EN

Stack Overflow用户
提问于 2018-05-05 05:53:23
回答 3查看 8.3K关注 0票数 9

我正在使用Typescript,Redux和React,所有这些对我来说都是新的,所以这可能有一个我没有看到的简单的修复方法。

我有一个actions.ts文件,其中包含如下枚举:

代码语言:javascript
复制
export enum AnimalTypes {
    CAT = 'CAT',
    DOG = 'DOG'
}

我将它导入到reducers.ts文件中,并尝试在日志语句中使用它,如下所示:

代码语言:javascript
复制
import {AnimalTypes} from './actions';

export function someFunction() {
    // Print the word "CAT"
    console.log(AnimalTypes[AnimalTypes.CAT]);
}

当我尝试启动我的站点时,我得到了以下错误:

代码语言:javascript
复制
TypeError: Cannot read property 'CAT' of undefined
  at someFunction (reducer.ts:5)
  at combineReducers.js:20
  etc.

我的集成开发环境没有给我任何错误,TSLint也没有。我在网上读了一堆试图找到答案的文章,但最接近我的是那些在枚举中没有"export“关键字的人,而我有。

这到底是怎么回事?如果有任何帮助,我将不胜感激。

谢谢。

编辑:不是反向映射有问题,而是枚举的任何用法都有问题。这是我能想到的最短的用法。我实际上是在switch语句中使用它:

代码语言:javascript
复制
import {AnimalTypes} from './actions';

export function otherFunction(animal) {
    switch (animal.type) {
        case AnimalTypes.CAT:
            // Do stuff
}

当我构建上面的代码时,我得到了这个错误Uncaught TypeError: Cannot read property 'CAT' of undefined

EN

回答 3

Stack Overflow用户

发布于 2018-05-05 10:46:56

typescript的这一特性被称为“反向映射”,根据文档,它只支持数字枚举。下面是来自https://www.typescriptlang.org/docs/handbook/enums.html的代码片段

除了为成员创建具有属性名称的对象外,数字枚举成员还获得从枚举值到枚举名称的反向映射。

票数 2
EN

Stack Overflow用户

发布于 2018-10-13 03:31:27

我无法重现您的情况:我在reducer中导入了一个枚举,并创建了记录该枚举的确切函数,它工作了。

但是,我在一个稍微不同的上下文中遇到了同样的问题:我在SideNav文件中为我的AppRoutes枚举添加了导入。在SideNav文件中,在通过一些JSON映射并返回一些TSX的const popularArticles中,当我尝试<NavLink to={AppRoutes.something}>时,我得到了“无法读取属性某种未定义的东西”,尽管在集成开发环境中将鼠标悬停在AppRoutes.something上会显示来自正确来源的正确值。我认为这与你的情况非常相似,所以我希望我的解决方案能帮助未来的读者遇到这个问题。

对我来说,解决这个问题的方法是将const popularArticles (位于SideNav类外部)集成到类内部的一个变量public popularArticles中,就在构造函数之前。我不知道为什么,但在进一步的实验中,我发现显然你不能在类或SFC之外访问枚举...

票数 2
EN

Stack Overflow用户

发布于 2019-12-20 01:44:04

我做的是这样的:

代码语言:javascript
复制
import {AnimalTypes} from './actions';

export function someFunction() {
    var animalTypesEnum = AnimalTypes;
    // Print the word "CAT"
    console.log(animalTypesEnum[animalTypesEnum.CAT]);
}

而且它起作用了。TS v3.6.4

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50183529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档