这里是这个问题的TypeScript游乐场示例,它只有这个问题所需的最低限度。
这是一个真实的例子:我有一个enum
export enum OrderType {
Market = 'MARKET',
Limit = 'LIMIT',
}然后我有一个输入字段
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’类型。
为什么会这样呢?枚举不只是一个物体吗?
{
Market: "MARKET",
Limit: "LIMIT"
}数字是从哪来的?
顺便说一句,我知道如果我使用type as any,TS错误就会消失。
发布于 2019-07-21 23:41:52
主要问题是Array。这是所希望的和预期的行为,因为TypeScript不能确定一个对象只有它所知道的键。
如果您确信您的对象中只有已知的键,那么您可以使用类型断言告诉编译器,它可以将Object.keys()作为一个更受限制的集合来处理,如下所示:
(Object.keys(OrderType) as Array<keyof typeof OrderType>).map(type =>
console.log(OrderType[type]) // okay now
);它抱怨type不是number的原因可能是因为enum类型有一个数字索引,以便为枚举中的任何数字值实现逆映射。当然,这里的示例纯粹是一个串枚举,但我猜它们在每个枚举对象类型上都添加了数字索引:
const hmm = OrderType[123]; // string 无论如何,当type只是string时,OrderType[type]是any,因为没有字符串索引签名,编译器警告对象上唯一的索引签名是数字。
好吧,希望这能帮上忙,祝你好运!
https://stackoverflow.com/questions/57137471
复制相似问题