TS 注意事项
TS 对象动态 key 类型报错
问题一
问题描述
先声明一个接口:
1 | interface User { |
然后创建一个对象:
1 | const user: User = { |
现在需要我们将 user 对象中的值置空:
1 | for (const key in user) { |
这时会报错:
1 | Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'User'. No index signature with a parameter of type 'string' was found on type 'User'. |
意思是 User 没有 string 类型的索引签名。
解决方法
1 | for (const key in user) { |
问题二
问题描述
若一个接口中有不同的类型:
1 | interface User { |
创建一个对象:
1 | const user: User = { |
现在有另一个 User 类型的对象 data,需要将 data 中的值循坏遍历到 user 中:
1 | for (const key in user) { |
依然会报错:
1 | Type 'string | number | undefined' is not assignable to type 'never'. Type 'undefined' is not assignable to type 'never'. |
是因为有多种类型后,不能确定是否是将一种类型的值赋值给相同的类型,比如 string 类型的值可能会赋值给 number,会产生歧义。
解决方法
第一种:
分类赋值。就是将各种类型分开赋值。
1 | for (const key in user) { |
这样做太过繁琐,如果只有两种类型可以考虑。
第二种:
添加索引签名。
1 | for (const key in user) { |