Skip to content

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 āĻ¸ā§āĻŦāϝāĻŧāĻ‚āĻ•ā§āϰāĻŋāϝāĻŧāĻ­āĻžāĻŦ⧇ āϤāĻžāĻĻ⧇āϰ āύāĻŋāϜāĻ¸ā§āĻŦ āϟāĻžāχāĻĒ āϏāĻ‚āĻœā§āĻžāĻžāϝāĻŧ āĻāχ āĻŦ⧃āĻĻā§āϧāĻŋāϗ⧁āϞāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāĻž āωāϚāĻŋāϤāĨ¤

āĻāχ āĻĒāϰāĻŋāĻŦāĻ°ā§āϧāύ⧇āϰ āĻ¸ā§āĻĨāĻžāĻĒāύāĻž āĻāĻ•āχ āĻŦāĻŋāϧāĻŋāύāĻŋāώ⧇āϧ āĻ—ā§āϞ⧋āĻŦāĻžāϞ āĻĒā§āϰāĻĒāĻžāĻ°ā§āϟāĻŋ āĻ…āĻ—āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύāϏ āϏāĻžāĻĒ⧇āĻ•ā§āώ⧇āĨ¤

āφāϰ⧋ āĻĻ⧇āϖ⧁āύ:

TypeScript with Options API has loaded