Open fyapy opened 2 years ago
This is interesting. I think we can push it a bit further the type génération for routes and the PR that @pikax sent #872 , maybe there is a way to extend the defined routes and then provide (with autocompletion) a name generic:
// given a route { path: '/users/:id', name: 'users' ... }
useRoute<'users'>() // route type with params: { id: string }
// given a route { path: '/posts/:slugs*', name: 'posts' ... }
useRoute<'posts'>() // route type with params: { slugs?: string[] }
@posva If we have plans for a useRoute hook, may be we can add a useParams hook with generic support? Because at the moment the problem with typing params is very annoying 😞
type Params = {
id: string
type: ResourceType
}
const params = useParams<Params>() // params with types information
as mentioned in https://github.com/vuejs/router/pull/1159#issuecomment-1055275856 let's keep this in userland for the moment
import { RouteParams } from 'vue-router'
import { computed } from 'vue'
function useParams<P extends RouteParams>() {
const route = useRoute()
return computed(
() => route.params as P
)
}
The current direction is leaning more towards something as automatic as possible with https://github.com/posva/unplugin-vue-router
Can't param types be correctly generated based on path
definition?
If it has *
after param string, type becomes string[]
, otherwise it's a simple string
.
Am I missing something here? Thanks
@amalitsky the reason is performance: https://www.youtube.com/watch?v=2hYU6HyTNdk
What problem does this feature solve?
Typing of params from useRoute.
When you have function with typed arguments
And when you try to pass a
route.params
as an argumentYou will get error
Argument of type 'string | string[]' is not assignable to parameter of type 'string'. Type 'string[]' is not assignable to type 'string'.
Screenshot of problem
What does the proposed API look like?
Pull Request
https://github.com/vuejs/vue-router-next/pull/1159