使用此代码会产生错误:
interface something {
[id: string]: string | something;
}
let obj: something = {
'1': 'str',
'2': {
'3': 'str'
}
};
function isObject(obj: any): boolean {
return typeof obj === 'object' && obj !== null;
}
for (let key in obj) {
const specific = obj[key];
if (isObject(specific)) {
for (let id in specific) {
// ^^^// The right-hand side of a
// 'for...in' statement must be of type 'any',
// an object type or a type parameter
}
}
}
但是,使用功能代码而不是isObject(specific)
时,它工作正常:
if (typeof specific === 'object' && specific !== null) {
// ...
为什么呢?我应该开始删除代码中的函数吗?
答案 0 :(得分:3)
当您对函数代码使用if
语句时,if
语句块中的TypeScript编译器可以从条件中了解specific
的类型是object
。那么为什么会这样呢
如果要使用功能检查,可以编写类似obj is object
的返回类型。这将根据您的情况返回boolean
,并告诉编译器您的obj
是object
。
function isObject(obj: any): obj is object {
return typeof obj === 'object' && obj !== null;
}
有关此技术的更多信息,请阅读Typescript Advanced Types