#typescript
Вопрос:
Я искал везде и не мог найти никакого способа проверить, относится ли данный объект к какому-либо пользовательскому типу или нет. Например, я объявляю тип Human как таковой:
type A = { name: string; age: number; }
Затем я хочу иметь функцию, которая будет получать объект и решать, относится ли он к типу человека или нет. Что-то вроде:
isOfTypeHuman = (input) => typeof input === Human
У меня такое чувство, что это невозможно, но я подумал, что, может быть, я что-то упускаю. Есть какие-нибудь идеи?
Комментарии:
1. Человек не существует во время выполнения, вы говорите о предикате типа ?
2. Вы можете использовать утиный набор текста. Или, поскольку вы определили тип для объекта, вы можете полагаться на TS, поскольку он позволяет использовать в качестве только объекты, которые можно назначить
A
A
. Однако, если у вас есть объект неизвестной формы, вы можете ввести его только уткой.3. @VLAZ, но как я могу проверить, что у него нет никаких нежелательных свойств (это не » имя «и не «возраст»?
4. Почему это должно иметь значение? В любом случае вы можете получить доступ к имени и возрасту только через человеческий интерфейс.
5. Проверьте, есть ли еще какие-нибудь ключи? Хотя на практике редко имеет значение, есть ли больше свойств. Если вы получаете объект, у которого также есть
employeeId
, это не значит, что это не человек. Просто другой тип.
Ответ №1:
Типы не существуют во время выполнения. Они полезны только во время компиляции, а затем удаляются.
Вам необходимо проверить себя:
// if it quacks like a duck..
isOfTypeHuman = (input) => input.name !== undefined amp;amp; input.age !== undefined
Вы можете дополнительно использовать определяемую пользователем защиту типов, чтобы остальная часть кода знала, что это человек
isOfTypeHuman = (input: any): input is Human => input.name !== undefined amp;amp; input.age !== undefined
Комментарии:
1. но как я могу проверить, что у него нет никаких нежелательных свойств (это не » имя «и не «возраст»?
2. это утка, печатающая для тебя. вам нужно сделать эти утверждения самостоятельно.
input instanceof ConcreteHumanClass
и тому подобное. на самом деле вам нужно проанализировать входные данные. вы можете получить все ключи объекта сObject.keys
помощью и проверить соответствие с тем , что вы ожидаете. Вам решать, насколько строгим вы хотите быть. В большинстве случаев в этом нет необходимости.