从技术上讲,数组仍然符合类型
{[key: string]: any}
. 您可以通过执行以下操作来验证这一点
const test: StringMap = [];
. typescript编译器不会抱怨。所以你首先必须排除
values
是一个数组。
接下来,你的功能
isPlainObject
返回类型定义为
obj is object
. 这太通用了,会导致代码块“忘记”对象有索引签名。它需要
obj is StringMap
.
所以在实践中,你需要做两件事:
-
在你的第一
if
语句,检查值是否为数组
-
改变你
ISP对象
返回类型声明到
对象是字符串映射
基本上看起来是这样的:
export function isPlainObject(obj: any): obj is StringMap {
// ...
}
export default function formatSql(values: QueryParams) {
if (Array.isArray(values)) {
// ...
} else if (isPlainObject(values)) {
console.log(values[p]);
} else {
throw new Error(`Unsupported values type`);
}
}