Как я могу проверить, имеет ли объект пользовательский тип в typescript?

#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 помощью и проверить соответствие с тем , что вы ожидаете. Вам решать, насколько строгим вы хотите быть. В большинстве случаев в этом нет необходимости.