foreach循环对象可能未定义

问题描述 投票:1回答:1

为什么ts编译器认为Object可能未定义?我在循环中抓住了更高的值。我有一个链接到操场here错误

interface Params {
    [key: string]: ParamTypes
}

type ParamTypes = string | boolean | Date | number | Params | undefined

function doSomething(params: Params) {
    const paramKeys = Object.keys(params);
    paramKeys.forEach(p => {
        if (typeof params[p] === 'undefined') {
            return;
        }
        if (Object.getPrototypeOf(params[p]) === Object.prototype) {
            doSomething(<Params>params[p]);
        } else {
            return params[p].toString(); // Error: Object is potentially undefined
        }
    })
}

编辑

要查看错误,您必须在选项中启用隐式空值检查。

typescript
1个回答
3
投票

It's a known limitation,编译器不记录typeof检查无限制索引访问的结果。它看起来像 was a PR to allow that但它从未合并 - 编译减速太多了。

解决方法是引入中间变量:

interface Params {
    [key: string]: ParamTypes
}

type ParamTypes = string | boolean | Date | number | Params | undefined

function doSomething(params: Params) {
    const paramKeys = Object.keys(params);
    paramKeys.forEach(p => {
        const param = params[p];
        if (typeof param === 'undefined') {
            return;
        }
        if (Object.getPrototypeOf(param) === Object.prototype) {
            doSomething(<Params>param);
        } else {
            return param.toString(); // Error: Object is potentially undefined
        }
    })
}
© www.soinside.com 2019 - 2024. All rights reserved.