打字稿:使用函数及其代码使用typeof运算符的不同结果

时间:2017-12-17 10:03:11

标签: 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;
}

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) {
// ...

为什么呢?我应该开始删除代码中的函数吗?

1 个答案:

答案 0 :(得分:3)

当您对函数代码使用if语句时,if语句块中的TypeScript编译器可以从条件中了解specific的类型是object。那么为什么会这样呢

如果要使用功能检查,可以编写类似obj is object的返回类型。这将根据您的情况返回boolean,并告诉编译器您的objobject

function isObject(obj: any): obj is object {
    return typeof obj === 'object' && obj !== null;
}

有关此技术的更多信息,请阅读Typescript Advanced Types