Видеоуроки, интерактивный редактор и сохранение прогресса — бесплатно, сразу после входа.
ВойтиСоздать аккаунт — бесплатноЗакончили урок?
Войдите, чтобы отмечать прогресс
Теперь T выводится из аргумента: isUser имеет тип (value: unknown) => value is User, значит T = User. Писать parseJson<User> больше не нужно, и, что важнее, нельзя получить User без проверки.
const parsed: unknown = JSON.parse(text). JSON.parse возвращает any, и явная аннотация unknown сразу запрещает с ним что-либо делать без проверки.isValid(parsed) ? parsed : null. Внутри ветки «да» type guard сужает parsed до T, поэтому as не нужен.T | null в результате. Вызывающий код обязан обработать неудачу, и fake.id без проверки на null не скомпилируется.Сигнатура вида function f<T>(...): T, где T не встречается в аргументах, почти всегда означает скрытый as. Так часто выглядят обёртки над fetch:
Это удобно, но тип здесь пообещан, а не проверен. Если сервер вернёт не то, ошибка всплывёт далеко от места загрузки. Для внешних данных лучше передавать проверку: самописный type guard, как здесь, или схему из библиотеки валидации вроде Zod, которая устроена по той же идее.