字典是日常开发中使用频率很高的一种数据结构,在进行名值转换的时候很方便。比如一个任务的执行状态,有“已执行”和“未执行”两种状态,在数据库里存的可能是1和0,在界面上显示的时候就需要转化成其代表的含义。
我们可以定义这样一个字典结构:
const taskStatus = {
'0': '未执行',
'1': '已执行'
}
然后我们可以定义一个函数来从字典中获取状态名
function getStatusName(key) {
return taskStatus[key] || ''
}
但是这样写的话,TypeScript会报错:
Parameter 'key' implicitly has an 'any' type. Element implicitly has an 'any' type because expression of type 'any' can't be used to index type '{ '0': string; '1': string; }'.
原因是变量key和字典索引的类型不匹配。
那么该怎样解决这个问题呢?
一种解决方案是在取值时通过类型断言来缩小key的类型:
function getStatusName(key:string):string {
return taskStatus[key as keyof typeof taskStatus]
}
这样能解决报错的问题,但不是最佳解决方案,类型断言应该在没有其他更好的解决办法的情况下使用,这里显然不是。
更好方法是缩小函数参数的类型:
function getStatusName(key:keyof typeof taskStatus):string {
return taskStatus[key]
}
这样TypeScript就能正确识别key的类型了
欢迎关注公众号:清晰编程,获取更多精彩内容