TypeScript with Options API â
āĻāĻ āĻĒā§āώā§āĻ āĻžāĻāĻŋ āϧāϰ⧠āύā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻĒāύāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ TypeScript āĻāϰ āϏāĻžāĻĨā§ Vue āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϰ āĻāĻāĻžāϰVue āĻĒāĻĄāĻŧā§āĻā§āύāĨ¤
TIP
āϝāĻĻāĻŋāĻ Vue Options API āĻāϰ āϏāĻžāĻĨā§ TypeScript āĻŦā§āϝāĻŦāĻšāĻžāϰ āϏāĻŽāϰā§āĻĨāύ āĻāϰā§, āĻāĻāĻŋ Composition API āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ TypeScript-āĻāϰ āϏāĻžāĻĨā§ Vue āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻĒāϰāĻžāĻŽāϰā§āĻļ āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧ āĻāĻžāϰāĻŖ āĻāĻāĻŋ āϏāĻšāĻ, āĻāϰāĻ āĻĻāĻā§āώ āĻāĻŦāĻ āĻāϰāĻ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻāĻžāĻāĻĒ āĻāύāĻĢāĻžāϰā§āύā§āϏ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§āĨ¤
Typing Component Props â
āĻ
āĻĒāĻļāύ āĻāĻĒāĻŋāĻāĻ-āĻ āĻĒā§āϰāĻĒāϏā§āϰ āĻāύā§āϝ āĻāĻžāĻāĻĒ āĻāύāĻĢāĻžāϰā§āύā§āϏā§āϰ āĻāύā§āϝ āĻāĻŽā§āĻĒā§āύā§āύā§āĻāĻā§ defineComponent()
āĻĻāĻŋāϝāĻŧā§ āĻŽā§āĻĄāĻŧāĻžāύ⧠āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤ āĻāĻāĻŋāϰ āϏāĻžāĻšāĻžāϝā§āϝā§, Vue props
āĻŦāĻŋāĻāϞā§āĻĒā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āĻĒā§āϰāĻĒāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻĒā§āϰāĻāĻžāϰāĻā§āϞāĻŋ āĻ
āύā§āĻŽāĻžāύ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāϝāĻŧ, āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āϝā§āĻŽāύ required: true
āĻāĻŦāĻ default
āĻšāĻŋāϏāĻžāĻŦā§ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰā§:
ts
import { defineComponent } from 'vue'
export default defineComponent({
// type inference enabled
props: {
name: String,
id: [Number, String],
msg: { type: String, required: true },
metadata: null
},
mounted() {
this.name // type: string | undefined
this.id // type: number | string | undefined
this.msg // type: string
this.metadata // type: any
}
})
āϝāĻžāĻāĻšā§āĻ, āϰāĻžāύāĻāĻžāĻāĻŽ props
āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāύāϏā§āĻā§āϰāĻžāĻā§āĻāϰ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋāĻā§ āĻĒā§āϰāĻĒā§āϰ āϧāϰāĻŖ āĻšāĻŋāϏāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠- āύā§āϏā§āĻā§āĻĄ āĻŦā§āĻļāĻŋāώā§āĻā§āϝ āĻŦāĻž āĻĢāĻžāĻāĻļāύ āĻāϞ āϏā§āĻŦāĻžāĻā§āώāϰ āϏāĻš āĻ
āĻŦāĻā§āĻā§āĻāϰ āĻŽāϤ⧠āĻāĻāĻŋāϞ āĻĒā§āϰāĻāĻžāϰāĻā§āϞāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāĻžāϰ āĻā§āύ⧠āĻāĻĒāĻžāϝāĻŧ āύā§āĻ⧎
āĻāĻāĻŋāϞ āĻĒā§āϰāĻĒ āϧāϰāύā§āϰ āĻā§āĻāĻž āĻāϰāϤā§, āĻāĻŽāϰāĻž PropType
āĻāĻāĻāĻŋāϞāĻŋāĻāĻŋ āĻāĻžāĻāĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ:
ts
import { defineComponent } from 'vue'
import type { PropType } from 'vue'
interface Book {
title: string
author: string
year: number
}
export default defineComponent({
props: {
book: {
// provide more specific type to `Object`
type: Object as PropType<Book>,
required: true
},
// can also annotate functions
callback: Function as PropType<(id: number) => void>
},
mounted() {
this.book.title // string
this.book.year // number
// TS Error: argument of type 'string' is not
// assignable to parameter of type 'number'
this.callback?.('123')
}
})
Caveats â
āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ TypeScript āϏāĻāϏā§āĻāϰāĻŖ 4.7
āĻāϰ āĻāĻŽ āĻšāϝāĻŧ, āϤāĻžāĻšāϞ⧠validator
āĻāĻŦāĻ default
āĻĒā§āϰāĻĒ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻĢāĻžāĻāĻļāύ āĻŽāĻžāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻžāĻā§ āϏāϤāϰā§āĻ āĻĨāĻžāĻāϤ⧠āĻšāĻŦā§ - arrow functions āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻā§āϞāĻŦā§āύ āύāĻž:
ts
import { defineComponent } from 'vue'
import type { PropType } from 'vue'
interface Book {
title: string
year?: number
}
export default defineComponent({
props: {
bookA: {
type: Object as PropType<Book>,
// Make sure to use arrow functions if your TypeScript version is less than 4.7
default: () => ({
title: 'Arrow Function Expression'
}),
validator: (book: Book) => !!book.title
}
}
})
āĻāĻāĻŋ āĻāĻžāĻāĻĒāϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻā§ āĻāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋāϰ āĻŽāϧā§āϝ⧠this
āϧāϰāύā§āϰ āĻ
āύā§āĻŽāĻžāύ āĻāϰāϤ⧠āĻŦāĻžāϧāĻž āĻĻā§āϝāĻŧ, āϝāĻž āĻĻā§āϰā§āĻāĻžāĻā§āϝāĻŦāĻļāϤ, āĻāĻžāĻāĻĒ āĻ
āύā§āĻŽāĻžāύ āĻŦā§āϝāϰā§āĻĨ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻŦāĻŦāϰā§āϤ⧠āĻĄāĻŋāĻāĻžāĻāύ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž, āĻāĻŦāĻ āĻāĻāύ āĻāύā§āύāϤ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ TypeScript 4.7.
Typing Component Emits â
āĻāĻŽāϰāĻž emits
āĻŦāĻŋāĻāϞā§āĻĒā§āϰ āĻ
āĻŦāĻā§āĻā§āĻ āϏāĻŋāύāĻā§āϝāĻžāĻā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āύāĻŋāϰā§āĻāϤ āĻāĻā§āύā§āĻā§āϰ āĻāύā§āϝ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻĒā§āϞā§āĻĄā§āϰ āϧāϰāύ āĻā§āώāĻŖāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āϏāĻŽāϏā§āϤ āĻ
-āĻā§āώāĻŋāϤ āύāĻŋāϰā§āĻāϤ āĻāĻā§āύā§āĻāĻā§āϞāĻŋ āĻāϞ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒ āϤā§āϰā§āĻāĻŋ āύāĻŋāĻā§āώā§āĻĒ āĻāϰāĻŦā§:
ts
import { defineComponent } from 'vue'
export default defineComponent({
emits: {
addBook(payload: { bookName: string }) {
// perform runtime validation
return payload.bookName.length > 0
}
},
methods: {
onSubmit() {
this.$emit('addBook', {
bookName: 123 // Type error!
})
this.$emit('non-declared-event') // Type error!
}
}
})
Typing Computed Properties â
āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒāĻŋāĻāĻā§āĻĄ āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋ āϤāĻžāϰ āϰāĻŋāĻāĻžāϰā§āύ āĻŽāĻžāύā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āϤāĻžāϰ āϧāϰāύ āĻ āύā§āĻŽāĻžāύ āĻāϰā§:
ts
import { defineComponent } from 'vue'
export default defineComponent({
data() {
return {
message: 'Hello!'
}
},
computed: {
greeting() {
return this.message + '!'
}
},
mounted() {
this.greeting // type: string
}
})
āĻāĻŋāĻā§ āĻā§āώā§āϤā§āϰā§, āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻāĻŖāύāĻž āĻāϰāĻž āĻāĻŽā§āĻĒāĻŋāĻāĻā§āĻĄ āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋāϰ āϧāϰāύāĻāĻŋ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰāϤ⧠āĻāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻžāϤ⧠āĻāĻāĻŋāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āϏāĻ āĻŋāĻ āĻšāϝāĻŧ:
ts
import { defineComponent } from 'vue'
export default defineComponent({
data() {
return {
message: 'Hello!'
}
},
computed: {
// explicitly annotate return type
greeting(): string {
return this.message + '!'
},
// annotating a writable computed property
greetingUppercased: {
get(): string {
return this.greeting.toUpperCase()
},
set(newValue: string) {
this.message = newValue.toUpperCase()
}
}
}
})
āĻāĻŋāĻā§ āĻĒā§āϰāĻžāύā§āϤā§āϰ āĻā§āώā§āϤā§āϰā§āĻ āϏā§āĻĒāώā§āĻ āĻā§āĻāĻžāĻā§āϞāĻŋāϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϤ⧠āĻĒāĻžāϰ⧠āϝā§āĻāĻžāύ⧠āĻŦā§āϤā§āϤāĻžāĻāĻžāϰ āĻ āύā§āĻŽāĻžāύ āϞā§āĻĒā§āϰ āĻāĻžāϰāĻŖā§ āĻāĻžāĻāĻĒāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒāĻŋāĻāĻā§āĻĄ āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋāϰ āϧāϰāĻŖ āĻ āύā§āĻŽāĻžāύ āĻāϰāϤ⧠āĻŦā§āϝāϰā§āĻĨ āĻšāϝāĻŧāĨ¤
Typing Event Handlers â
āύā§āĻāĻŋāĻ DOM āĻāĻā§āύā§āĻāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻĄāĻŋāϞ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, āĻāĻŽāϰāĻž āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰāĻā§ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āϝ⧠āĻāϰā§āĻā§āĻŽā§āύā§āĻ āĻĻāĻŋāϝāĻŧā§ āĻĨāĻžāĻāĻŋ āϤāĻž āĻāĻžāĻāĻĒ āĻāϰāĻž āĻāĻžāϰā§āϝāĻāϰ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāϏā§āύ āĻāĻ āĻāĻĻāĻžāĻšāϰāĻŖāĻāĻŋ āĻāĻāĻŦāĻžāϰ āĻĻā§āĻā§ āύā§āĻāϝāĻŧāĻž āϝāĻžāĻ:
vue
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
methods: {
handleChange(event) {
// `event` implicitly has `any` type
console.log(event.target.value)
}
}
})
</script>
<template>
<input type="text" @change="handleChange" />
</template>
āĻāĻžāĻāĻĒ āĻā§āĻāĻž āĻŦā§āϝāϤā§āϤ, event
āĻāϰā§āĻā§āĻŽā§āύā§āĻā§ āύāĻŋāĻšāĻŋāϤāĻāĻžāĻŦā§ any
āĻĒā§āϰāĻāĻžāϰ āĻĨāĻžāĻāĻŦā§āĨ¤ tsconfig.json
-āĻ āϝāĻĻāĻŋ "strict": true
āĻŦāĻž "noImplicitAny": true
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧ āϤāĻžāĻšāϞ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ TS āϤā§āϰā§āĻāĻŋāϰ āĻāĻžāϰāĻŖ āĻšāĻŦā§āĨ¤ āϤāĻžāĻ āĻāĻā§āύā§āĻ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰāĻĻā§āϰ āϝā§āĻā§āϤāĻŋ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āĻā§āĻāĻž āĻāϰāĻžāϰ āϏā§āĻĒāĻžāϰāĻŋāĻļ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻĒāϰāύā§āϤā§, event
āĻāϰ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋ āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻžāĻā§ āĻāĻžāĻāĻĒ āĻ
ā§āϝāĻžāϏāĻžāϰā§āĻā§āĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻšāϤ⧠āĻĒāĻžāϰā§:
ts
import { defineComponent } from 'vue'
export default defineComponent({
methods: {
handleChange(event: Event) {
console.log((event.target as HTMLInputElement).value)
}
}
})
Augmenting Global Properties â
āĻāĻŋāĻā§ āĻĒā§āϞāĻžāĻāĻāύ app.config.globalProperties
āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āϏāĻŽāϏā§āϤ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻĻāĻžāĻšāϰāĻŖā§ āĻŦāĻŋāĻļā§āĻŦāĻŦā§āϝāĻžāĻĒā§ āĻāĻĒāϞāĻŦā§āϧ āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻā§āϞāĻŋ āĻāύāϏā§āĻāϞ āĻāϰā§āĨ¤ āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻŽāϰāĻž āĻĄā§āĻāĻž-āĻĢā§āĻāĻŋāĻāϝāĻŧā§āϰ āĻāύā§āϝ this.$http
āĻŦāĻž āĻāύā§āϤāϰā§āĻāĻžāϤāĻŋāĻā§āĻāϰāĻŖā§āϰ āĻāύā§āϝ this.$translate
āĻāύāϏā§āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ TypeScript-āĻāϰ āϏāĻžāĻĨā§ āĻāĻ āύāĻžāĻāĻāĻāĻŋāĻā§ āĻāĻžāϞāĻāĻžāĻŦā§ āϤā§āϰāĻŋ āĻāϰāϤā§, Vue āĻāĻāĻāĻŋ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻāĻžāϏā§āĻāĻŽ āĻĒā§āϰā§āĻĒāĻžāϰā§āĻāĻŋāĻ
āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻĒā§āϰāĻāĻžāĻļ āĻāϰ⧠āϝāĻž TypeScript āĻŽāĻĄāĻŋāĻāϞ āĻ
āĻāĻŽā§āύā§āĻā§āĻļāύ āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒāϰāĻŋāĻŦāϰā§āϧāύ āĻāϰāĻžāϰ āĻāύā§āϝ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ :
ts
import axios from 'axios'
declare module 'vue' {
interface ComponentCustomProperties {
$http: typeof axios
$translate: (key: string) => string
}
}
āĻāϰ⧠āĻĻā§āĻā§āύ:
Type Augmentation Placement â
āĻāĻŽāϰāĻž āĻāĻ āϧāϰāύā§āϰ āĻĒāϰāĻŋāĻŦāϰā§āϧāύ āĻāĻāĻāĻŋ .ts
āĻĢāĻžāĻāϞ⧠āĻŦāĻž āĻĒā§āϰāĻā§āĻā§āĻ-āĻŦā§āϝāĻžāĻĒā§ *.d.ts
āĻĢāĻžāĻāϞ⧠āϰāĻžāĻāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āϝā§āĻāĻžāĻŦā§āĻ āĻšā§āĻ, āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύ āϝ⧠āĻāĻāĻŋ tsconfig.json
-āĻ āĻ
āύā§āϤāϰā§āĻā§āĻā§āϤ āϰāϝāĻŧā§āĻā§āĨ¤ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ/āĻĒā§āϞāĻžāĻāĻāύ āϞā§āĻāĻāĻĻā§āϰ āĻāύā§āϝ, āĻāĻ āĻĢāĻžāĻāϞāĻāĻŋ package.json
-āĻ types
āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋāϤ⧠āĻāϞā§āϞā§āĻ āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤
āĻŽāĻĄāĻŋāĻāϞ āĻ
āĻāĻŽā§āύā§āĻā§āĻļāύā§āϰ āϏā§āĻŦāĻŋāϧāĻž āύā§āĻāϝāĻŧāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāĻā§ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻšāĻŦā§ āϝ⧠āĻ
āĻāĻŽā§āύā§āĻā§āĻļāύāĻāĻŋ āĻāĻāĻāĻŋ TypeScript āĻŽāĻĄāĻŋāĻāϞ āĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤ āĻ
āϰā§āĻĨāĻžā§, āĻĢāĻžāĻāϞāĻāĻŋāϤ⧠āĻ
āύā§āϤāϤ āĻāĻāĻāĻŋ āĻļā§āϰā§āώ-āϏā§āϤāϰā§āϰ import
āĻŦāĻž export
āĻĨāĻžāĻāϤ⧠āĻšāĻŦā§, āĻāĻŽāύāĻāĻŋ āϝāĻĻāĻŋ āϤāĻž āĻā§āĻŦāϞ export {}
āĻ āĻšāϝāĻŧāĨ¤ āϝāĻĻāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϧāύ āĻāĻāĻāĻŋ āĻŽāĻĄāĻŋāĻāϞā§āϰ āĻŦāĻžāĻāϰ⧠āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻž āĻšāϝāĻŧ, āϤāĻŦā§ āĻāĻāĻŋ āĻŽā§āϞ āĻĒā§āϰāĻāĻžāϰāĻā§āϞāĻŋāĻā§ āĻŦā§āĻĻā§āϧāĻŋ āĻāϰāĻžāϰ āĻĒāϰāĻŋāĻŦāϰā§āϤ⧠āĻāĻāĻžāϰāϰāĻžāĻāĻ āĻāϰāĻŦā§!
ts
// Does not work, overwrites the original types.
declare module 'vue' {
interface ComponentCustomProperties {
$translate: (key: string) => string
}
}
ts
// Works correctly
export {}
declare module 'vue' {
interface ComponentCustomProperties {
$translate: (key: string) => string
}
}
Augmenting Custom Options â
āĻāĻŋāĻā§ āĻĒā§āϞāĻžāĻāĻāύ, āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ vue-router
, āĻāĻžāϏā§āĻāĻŽ āĻāĻŽā§āĻĒā§āύā§āύā§āĻ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋāϰ āĻāύā§āϝ āϏāĻŽāϰā§āĻĨāύ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āϝā§āĻŽāύ beforeRouteEnter
:
ts
import { defineComponent } from 'vue'
export default defineComponent({
beforeRouteEnter(to, from, next) {
// ...
}
})
āϏāĻ āĻŋāĻ āĻāĻžāĻāĻĒ āĻ
āĻāĻŽā§āύā§āĻā§āĻļāύ āĻāĻžāĻĄāĻŧāĻž, āĻāĻ āĻšā§āĻā§āϰ āĻāϰā§āĻā§āĻŽā§āύā§āĻā§āϰ āĻ
āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤāĻāĻžāĻŦā§ any
āĻĒā§āϰāĻāĻžāϰ āĻĨāĻžāĻāĻŦā§āĨ¤ āĻāĻŽāϰāĻž āĻāĻ āĻāĻžāϏā§āĻāĻŽ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋāĻā§ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻžāϰ āĻāύā§āϝ ComponentCustomOptions
āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻā§ āĻŦāĻžāĻĄāĻŧāĻŋāϝāĻŧā§ āϤā§āϞāϤ⧠āĻĒāĻžāϰāĻŋ:
ts
import { Route } from 'vue-router'
declare module 'vue' {
interface ComponentCustomOptions {
beforeRouteEnter?(to: Route, from: Route, next: () => void): void
}
}
āĻāĻāύ beforeRouteEnter
āĻ
āĻĒāĻļāύāĻāĻŋ āϏāĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻžāĻāĻĒ āĻāϰāĻž āĻšāĻŦā§āĨ¤ āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āĻāĻāĻŋ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāϰāĻŖ - āĻāĻžāϞ-āĻāĻžāĻāĻĒ āĻāϰāĻž āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āϝā§āĻŽāύ vue-router
āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āϤāĻžāĻĻā§āϰ āύāĻŋāĻāϏā§āĻŦ āĻāĻžāĻāĻĒ āϏāĻāĻā§āĻāĻžāϝāĻŧ āĻāĻ āĻŦā§āĻĻā§āϧāĻŋāĻā§āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻāϰāĻž āĻāĻāĻŋāϤāĨ¤
āĻāĻ āĻĒāϰāĻŋāĻŦāϰā§āϧāύā§āϰ āϏā§āĻĨāĻžāĻĒāύāĻž āĻāĻāĻ āĻŦāĻŋāϧāĻŋāύāĻŋāώā§āϧ āĻā§āϞā§āĻŦāĻžāϞ āĻĒā§āϰāĻĒāĻžāϰā§āĻāĻŋ āĻ āĻāĻŽā§āύā§āĻā§āĻļāύāϏ āϏāĻžāĻĒā§āĻā§āώā§āĨ¤
āĻāϰ⧠āĻĻā§āĻā§āύ:
GitHub-āĻ āĻāĻ āĻĒā§āώā§āĻ āĻžāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰā§āύ