Свойство не существует для типа «объект» ошибка после проверки, существует ли свойство для объекта

#reactjs #typescript

#reactjs #typescript

Вопрос:

Проблема: я пытаюсь создать защиту типа, которая должна проверять, существуют ли некоторые значения для свойства неизвестного типа.

 interface TestProps {
    count: number;
}

const getIsTestShown = (test: unknown): test is TestProps => {
    if (test amp;amp; 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. typeof test === object уже является защитой типа. В результате вы обрабатываете test как объект.

2. используйте any в качестве типа test в списке аргументов, а не unknown

3. Если вы хотите использовать test: unknown в параметре функции, вы должны сузить его, прежде чем обращаться к count свойству.

4. Спасибо за ответы, это сработало. @NicoVignola не могли бы вы объяснить, что именно вы имеете в виду? Как бы я мог в этом примере использовать unknown для параметра вместо использования any

Ответ №1:

Вы могли бы попробовать это:

 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
  

Если ссылки говорят вам не использовать any , я бы предложил отключить их для этой конкретной функции, поскольку вы уже проверяете существование свойства и типа.

Редактировать: Здесь приведен более подробный пример того, как вы могли бы использовать unknown и почему это работает не так, как any .

Комментарии:

1. Большое вам спасибо, это решило мою проблему. Не могли бы вы объяснить мне, почему я не могу использовать unknown здесь?

2. Короче говоря, unknown является типобезопасным аналогом any . Неизвестное может быть присвоено чему угодно, но вы не можете ничего присвоить unknown или выполнить какие-либо операции с ним без предварительного сужения его до типа. Вы можете прочитать больше об этом здесь

3. @aronfischer Я отредактировал ответ с демонстрацией, которая должна показать вам разницу