首先在js的对象中有一个设定,就是对象的key可以是字符串,也可以是数字。
不论key是字符串还是数字,遍历对象key的时候,这个key会变成字符串
通过[] 操作符访问key对应值时候,不论是数字还是字符串都转成了 字符串的key 进行访问
上一段js代码:
let obj = {}
for(let key of [1,2,3]){
obj[key] = "xxx"
}
for(let key in obj){
console.log(typeof key)
}
let key1 = '2'
console.log(obj[key1])
let key2 = 2
console.log(obj[key2])
输出结果是:
可以看到 obj[key] = "xxx" 赋值的时候,确实key是number
但是遍历key的时候,打印出的类型是string
后面通过key1(string)和key2(number)访问元素,都是可以的
改成ts代码如下
type key_val = {
[key:number]:string
}
let obj:key_val = {}
for(let key of [1,2,3]){
obj[key] = "xxx"
}
for(let key in obj){
console.log(typeof key)
}
let key1 = '2'
console.log(obj[key1])
let key2 = 2
console.log(obj[key2])
这段代码就过不去,ts编译会报错(但是编辑时候的代码提示没法报错)
key1是string时候是不行的,必须要求是number
然后,有趣的事情来了
这样遍历对象,打印的key类型确实是string,但是这个时候ts就不会报错,意思是不显式声明key的类型,就可以访问了
为什么说不显示声明就可以,比如刚才代码稍加改动,访问时候给key显式得变成string了,然后就报错了
当然,这些都可以理解,毕竟是编译成js在运行,这里只是ts套壳类型的时候编译报错
比如刚才的代码编译成js文件是这样:
然后直接运行编译后的js是没有问题的