场景 & 问题 在访问对象的成员变量时,经常会用到使用字符串作为索引。在JS中,这样的用法是可以的。但是在TS中,当被访问的对象被赋予类型之后,这样的操作将会抛出异常,示例如下: ## JS中 1 2 3 4 5 6 7 8 9 10 11 12 const testObj = { key1 : 1 , key2 :2 }; const tempKeys = Object .keys (testObj); tempKeys.forEach ((item )=> { console .log (testObj[key]); });
上述代码将输出我们预期的结果。
TS中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 interface TestObjType { key1 :number ; key2 :number ; } const testObj :TestObjType = { key1 :1 , key2 :2 } type tempKeysType = keyof TestObjType const tempKeys = Object .keys (testObj) as Array <keyof TestObjType >; tempKeys.forEach ((item:tempKeysType )=> { console .log (testObj[key]); }); tempKeys.forEach ((item:string )=> { console .log (testObj[key]); });
解决思路 对于这一问题的出现,猜测可能是由于在 1 const tempKeys = Object .keys (testObj) as Array <keyof TestObjType >;
但此时可以看到,tempKeys的类型已经变成了 所以问题很可能是由 Object.keys 的默认值导致的。 由此可得如下解决方案
解决方案 对于此问题,需要封装一个新的 keys 函数来解决
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function keys<O extends object >(obj : O): Array <keyof O> { return Object .keys (obj) as Array <keyof O>; } interface TestObjType { key1 :number ; key2 :number ; } const testObj :TestObjType = { key1 :1 , key2 :2 } type tempKeysType = keyof TestObjType const tempKeys = keys (testObj) ; tempKeys.forEach ((item:tempKeysType )=> { console .log (testObj[key]); });
上述代码将输出我们预期的结果。