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是的。像那样