检查对象上是否存在属性后,类型“对象”上的属性不存在

时间:2020-08-26 12:10:32

标签: reactjs typescript

问题: 我正在尝试创建一个类型防护,它应检查类型未知的属性上是否存在某些值。

interface TestProps {
    count: number;
}

const getIsTestShown = (test: unknown): test is TestProps => {
    if (test && typeof test === "object") {
        if ("count" in test) {
            if (typeof test.count === "number") {  // ERROR: Property 'count' does not exist on type 'object'.ts(2339)

                return true;
            }
        }
    }

    return false;
};

上面的示例已简化,但恰好代表了我的问题。 Typescript似乎不了解如果 "count" in test为true,则应在测试中访问count。 我想念什么?

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

interface TestProps {
    count: number;
}

const getIsTestShown = (test: any): test is TestProps => {
    return typeof test?.count === "number" ?? false;
};

console.log(getIsTestShown({})) // false
console.log(getIsTestShown({ count: 1 })) // true
console.log(getIsTestShown({ count: "1" })); // false
console.log(getIsTestShown({ someOtherProp: "1" })); // false

如果linters告诉您不要使用any,由于您已经在检查属性和类型的存在,我建议对特定功能禁用它们。

编辑:Here是一个更详细的示例,说明如何使用unknown以及为什么它不像any那样起作用。