typescript - 获取元素隐式具有“任何”类型,因为“数字”类型的表达式不能用于索引类型错误
问题描述
我编写了以下代码,尽量避免使用 switch/case 或 if 语句:
function getReason(reasonNumber: number) {
let fn;
const reasons = {
0: function() {
return "Activation"
},
1: function() {
return "Downgrade"
},
2: function() {
return "Upgrade"
},
3: function() {
return "Cancellation"
},
4: function() {
return "Incompatibility"
}
}
fn = reasons[reasonNumber]
return fn();
}
问题是我收到一个 TypeScript 错误fn = reasons[reasonNumber]
,错误是:
Element implicitly has an 'any' type because expression of type 'number' can't be used to index type '{ 0: () => string; 1: () => string; 2: () => string; 3: () => string; 4: () => string; }'.
No index signature with a parameter of type 'number' was found on type '{ 0: () => string; 1: () => string; 2: () => string; 3: () => string; 4: () => string; }'.
我尝试阅读有关可索引类型的信息,但我不明白如何在这种情况下使用它们。希望可以有人帮帮我!提前致谢!
解决方案
尽管错误本身并不完全清楚,但我相信这是因为您有可能getReason
使用不受支持的号码(任何高于 4 的号码)拨打电话。如果这要运行,它会出错,因为 undefined 不是函数。
在此函数中处理它的最安全方法是只允许特定数字:
function getReason(reasonNumber: 0 | 1 | 2 | 3 | 4) {
let fn;
const reasons = {
0: function() {
return "Activation"
},
1: function() {
return "Downgrade"
},
2: function() {
return "Upgrade"
},
3: function() {
return "Cancellation"
},
4: function() {
return "Incompatibility"
}
}
fn = reasons[reasonNumber]
return fn();
}
getReason(1) // allowed
getReason(5) // not allowed
这可能只是将类型错误移动到getReason
调用位置。如果您愿意,可以在内部处理错误或提供合理的后备值:
function getReason(reasonNumber: number): string {
const reasons: Record<string, () => string> = {
0: function() {
return "Activation"
},
1: function() {
return "Downgrade"
},
2: function() {
return "Upgrade"
},
3: function() {
return "Cancellation"
},
4: function() {
return "Incompatibility"
}
}
if (reasons[reasonNumber]) {
const fn = reasons[reasonNumber]
return fn()
} else {
// Either handle the error, or return a default...
throw new Error('')
}
}
推荐阅读
- laravel - Request::is() 仅适用于父路由。如何在子路线上使用它?
- regex - regxr 上的正则表达式匹配但 bash 中不匹配
- r - 抓取所有链接网站的 PDF
- google-cloud-platform - 谷歌云平台:生命周期版本控制如何在谷歌云存储中工作
- caching - 通过多服务器处理内存中缓存数据的方法
- javascript - 更改身体最大高度
- linux - Windows AD 及其密钥选项卡文件
- php - Laravel 调度程序任务不会在望远镜中记录命令的输出
- datetime - 1 个数据集中的不同日期/时间值
- javascript - SAPUI5 单个过滤器中的多个值