Ошибка ввода параметра маршрута с помощью TypeScript и unplugin-vue-router

Я изучаю Vue 3 с API композиции, используя TypeScript. В одном из руководств, которые я делаю, предлагается использовать unplugin-vue-router для автоматического создания маршрутов на основе соглашений об именах файлов и путях. Плагин работает корректно, но TypeScript недовольны параметрами маршрута. Например, у меня есть базовая страница Vue:

<script setup lang = "ts">
import { useRoute } from 'vue-router'
const route = useRoute()
</script>

<template>
  <div>
    <h1>Page slug: {{ route.params?.slug }}</h1>
  </div>
</template>

TypeScript выделяет slug и предупреждает, что «Свойство 'slug' не существует для типа 'Record<never, Never> | { catchAll: string; } | { slug: string; } | { id: string; }'».

Погуглив, я нашел именно эту проблему как проблему на сайте unplugin-vue-router Github, но предложение «использовать сужение типа» расплывчато и, насколько я понимаю, на самом деле не работает в этой ситуации. могу сказать.

Как я могу избавиться от этой ошибки TypeScript при использовании параметров маршрута и unplugin-vue-router?

Предложение состоит в том, что вам нужно проверить форму params, потому что это может не быть объект со свойством slug. Попробуйте {{ ("slug" in route.params && route.params.slug) }}

Aluan Haddad 22.08.2024 00:35
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете указать тип для useRoute следующим образом:

const route = useRoute<'ProductDetails'>()

Тип ProductDetails берется из RouteNamedMap, предоставленного unplugin-vue-router:

'ProductDetails': RouteRecordInfo<'ProductDetails', '/products/:id', { id: ParamValue<true> }, { id: ParamValue<false> }>,

Однако этот подход в настоящее время может привести к следующей ошибке TypeScript: Тип «ProductDetails» не удовлетворяет ограничению «keyof RouteNamedMap».

Просматривая документацию, вы можете найти:

// these are all valid
let userWithId = useRoute() as RouteLocationNormalizedLoaded<'/users/[id]'>
userWithId = useRoute<'/users/[id]'>()
// 👇 this one is the easiest to write because it autocompletes
userWithId = useRoute('/users/[id]')

userWithId.params

Так что может быть один для вас.

Самым простым был userWithId = useRoute('/users/[id]'), который отлично работает, хотя кажется немного нелогичным указывать маршрут, когда весь смысл unplugin-vue-router состоит в том, чтобы сделать маршрутизацию динамической на основе соглашений. Спасибо!

AJ. 22.08.2024 15:05

Другие вопросы по теме