首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用枚举作为对象时,“元素隐式具有'any‘类型,因为索引表达式不是’number‘类型”,为什么?

当使用枚举作为对象时,“元素隐式具有'any‘类型,因为索引表达式不是’number‘类型”,为什么?
EN

Stack Overflow用户
提问于 2019-07-21 22:35:37
回答 1查看 495关注 0票数 1

这里是这个问题的TypeScript游乐场示例,它只有这个问题所需的最低限度。

这是一个真实的例子:我有一个enum

代码语言:javascript
复制
export enum OrderType {
  Market = 'MARKET',
  Limit = 'LIMIT',
}

然后我有一个输入字段

代码语言:javascript
复制
export const TypeInputInner = ({ onChange, value }: Props) => {
  return (
    <Select style={{ width: 150, margin: 5 }} value={value} onChange={onChange}>
      {Object.keys(OrderType).map(type => (
        <Option key={type} value={OrderType[type]}>
          {type}
        </Option>
      ))}
    </Select>
  );
};

OrderType[type]部件上存在TS错误:

错误:(16,45) TS7015: Element隐式具有'any‘类型,因为索引表达式不是'number’类型。

为什么会这样呢?枚举不只是一个物体吗?

代码语言:javascript
复制
{
  Market: "MARKET",
  Limit: "LIMIT"
}

数字是从哪来的?

顺便说一句,我知道如果我使用type as any,TS错误就会消失。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-21 23:41:52

主要问题是Array。这是所希望的和预期的行为,因为TypeScript不能确定一个对象只有它所知道的键。

如果您确信您的对象中只有已知的键,那么您可以使用类型断言告诉编译器,它可以将Object.keys()作为一个更受限制的集合来处理,如下所示:

代码语言:javascript
复制
(Object.keys(OrderType) as Array<keyof typeof OrderType>).map(type =>
  console.log(OrderType[type]) // okay now
);

它抱怨type不是number的原因可能是因为enum类型有一个数字索引,以便为枚举中的任何数字值实现逆映射。当然,这里的示例纯粹是一个串枚举,但我猜它们在每个枚举对象类型上都添加了数字索引:

代码语言:javascript
复制
const hmm = OrderType[123]; // string 

无论如何,当type只是string时,OrderType[type]any,因为没有字符串索引签名,编译器警告对象上唯一的索引签名是数字。

好吧,希望这能帮上忙,祝你好运!

链接到代码

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

https://stackoverflow.com/questions/57137471

复制
相关文章

相似问题

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