#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 Я отредактировал ответ с демонстрацией, которая должна показать вам разницу