Typescript:使用函数的不同结果及其使用typeof运算符的代码
使用此代码会产生错误:Typescript:使用函数的不同结果及其使用typeof运算符的代码,typescript,runtime,typescript2.0,typeof,Typescript,Runtime,Typescript2.0,Typeof,使用此代码会产生错误: 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
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
语句与函数代码一起使用时,if
语句块中的TypeScript编译器可以从特定
的类型为对象的条件中理解。那么它为什么有效呢
如果要使用函数检查,可以编写类似于obj is object
的返回类型。这将根据您的条件返回boolean
,并告诉编译器您的obj
是否为object
function isObject(obj: any): obj is object {
return typeof obj === 'object' && obj !== null;
}
有关此技术的更多信息,您可以在将if
语句与函数代码一起使用时阅读,if
语句块中的TypeScript编译器可以从特定的类型为对象的条件中理解。那么它为什么有效呢
如果要使用函数检查,可以编写类似于obj is object
的返回类型。这将根据您的条件返回boolean
,并告诉编译器您的obj
是否为object
function isObject(obj: any): obj is object {
return typeof obj === 'object' && obj !== null;
}
有关此技术的更多信息,请阅读isObject
可能会告诉您某个对象是非空对象,但它不会告诉编译器。参见isObject
中的“用户定义类型保护”可能会告诉您某个对象是非空对象,但它不会告诉编译器。参见So中的“用户定义类型保护”,在我的例子中,它将是isObject(obj:any):obj是object{
?@Alex是的。像这样,在我的例子中,它将是isObject(obj:any):obj是object{
?@Alex是的。像那样