vue.js - Typescript | Vue3 - ¿Cómo un parámetro de ruta específico puede devolver un arreglo de cadenas?
Considera este error de compilación:
src/views/IndividualProgramView.vue:18:63 - error TS2345: Argument of type 'string | string[]' is not assignable to parameter of type 'string'.
Type 'string[]' is not assignable to type 'string'.
18 const ProgramForm = () => programStore.renderProgramExercises(route.params.program);
Estoy tratando de encontrar el parámetro en esta ruta: /program/1 usando route.params.program.
¿Cómo puede esto devolver alguna vez string[] como tipo?
Entonces estoy pasando este valor a una función que está esperando una cadena:
renderProgramExercises(id: string): VNode {
¿Cómo puedo arreglar este error de compilación?
Hice lo siguiente, lo cual funciona, pero siento que está mal:
renderProgramExercises(id: string | string[]): VNode {
Gracias,
Respuesta #1
Un parámetro de ruta solo puede ser un arreglo cuando la ruta está configurada con un parámetro repetible:
const router = createRouter({
routes: [
{
// repeatable (0 or more) 👇 param is `string | string[]` (empty string if param absent)
path: '/programs/:program(\\d+)*',
// OR:
// repeatable (1 or more) 👇 param is `string[]`
path: '/programs/:program(\\d+)+',
// OR:
// non-repeatable (1) param is `string`
path: '/programs/:program(\\d+)',
⋮
}
]
})
Para un parámetro repetible *, su tipo es string si el parámetro está ausente en la URL, o string[] de lo contrario, por lo que obtiene el valor del parámetro según su tipo:
const program = Array.isArray(route.params.program)
? route.params.program[0]
: route.params.program;
programStore.renderProgramExercises(program);
Para un parámetro + repetible, asume que es siempre un string[], y pasa el primer elemento del arreglo:
programStore.renderProgramExercises(route.params.program[0]);
Para un parámetro no repetible, asume que siempre es un string, y usa la afirmación de tipo (palabra clave as seguida del tipo deseado):
programStore.renderProgramExercises(route.params.program as string);
