Article image Using TypeScript with Vue

37. Using TypeScript with Vue

Page 67 | Listen in audio

Vue.js is a progressive JavaScript framework used for building user interfaces. It is designed to be incrementally adoptable, which means that it can be integrated into projects in a variety of ways, from enhancing simple static pages to powering sophisticated single-page applications. With the rise of TypeScript, many developers have started leveraging its static typing capabilities to enhance the robustness and maintainability of Vue applications.

TypeScript offers several advantages when used with Vue. It provides type safety, which helps catch errors during development rather than at runtime. This can significantly reduce bugs and improve code quality. Additionally, TypeScript's powerful tooling, including autocompletion, navigation, and refactoring, can greatly enhance the developer experience.

Setting Up TypeScript in a Vue Project

The first step in using TypeScript with Vue is setting up your project. If you are starting from scratch, Vue CLI makes it easy to scaffold a new project with TypeScript support. You can create a new Vue project with TypeScript by running the following command:

vue create my-vue-app

During the setup process, you will be prompted to choose features for your project. Select "TypeScript" from the list of available options. The Vue CLI will then set up a new project with TypeScript configured out of the box.

If you are adding TypeScript to an existing Vue project, you can do so by installing the necessary dependencies and creating a tsconfig.json file. The following steps outline this process:

  1. Install TypeScript and the necessary Vue TypeScript support packages:
  2. npm install --save-dev typescript @vue/cli-plugin-typescript
  3. Create a tsconfig.json file in the root of your project with the following basic configuration:
  4. {
      "compilerOptions": {
        "target": "esnext",
        "module": "esnext",
        "strict": true,
        "jsx": "preserve",
        "importHelpers": true,
        "moduleResolution": "node",
        "experimentalDecorators": true,
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,
        "sourceMap": true,
        "baseUrl": ".",
        "types": ["webpack-env", "jest"],
        "paths": {
          "@/*": ["src/*"]
        },
        "lib": [
          "esnext",
          "dom",
          "dom.iterable",
          "scripthost"
        ]
      },
      "include": [
        "src/**/*.ts",
        "src/**/*.tsx",
        "src/**/*.vue",
        "tests/**/*.ts",
        "tests/**/*.tsx"
      ],
      "exclude": [
        "node_modules"
      ]
    }

Using TypeScript in Vue Components

With TypeScript set up, you can start writing Vue components using TypeScript. Vue components can be written in TypeScript by using the <script lang="ts"> tag in your .vue files. Here's an example of a simple Vue component written in TypeScript:

<template>
  <div>
    <h1>Hello, {{ name }}!</h1>
    <button @click="changeName">Change Name</button>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  data() {
    return {
      name: 'World'
    };
  },
  methods: {
    changeName() {
      this.name = 'Vue.js';
    }
  }
});
</script>

In this example, we use the defineComponent function from Vue to define our component. This function helps with type inference, allowing TypeScript to understand the shape of the component's data, methods, and other options.

Type Safety with Props and Events

One of the key features of Vue components is the ability to accept props. Props are custom attributes you can register on a component to pass data from a parent component. With TypeScript, you can define the types of your props to ensure type safety. Here's how you can define typed props in a Vue component:

<script lang="ts">
import { defineComponent, PropType } from 'vue';

export default defineComponent({
  props: {
    message: {
      type: String as PropType<string>,
      required: true
    },
    count: {
      type: Number as PropType<number>,
      default: 0
    }
  },
  setup(props) {
    console.log(props.message, props.count);
  }
});
</script>

In this example, the message prop is required and must be a string, while the count prop is optional and defaults to 0 if not provided. TypeScript will enforce these types, providing compile-time safety.

Similarly, you can define and type custom events emitted by your component. Here's an example:

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  emits: ['update'],
  methods: {
    updateValue() {
      this.$emit('update', 42);
    }
  }
});
</script>

In this example, the component emits an update event with a number as its payload. TypeScript will ensure that the payload matches the expected type when the event is emitted.

Leveraging Vue's Composition API with TypeScript

Vue's Composition API is a powerful feature that allows developers to organize and reuse logic in Vue components. It is particularly well-suited for use with TypeScript, as it provides better type inference and more explicit type definitions.

Here's an example of using the Composition API with TypeScript:

<template>
  <div>
    <h2>Counter: {{ count }}</h2>
    <button @click="increment">Increment</button>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue';

export default defineComponent({
  setup() {
    const count = ref(0);

    function increment() {
      count.value++;
    }

    return {
      count,
      increment
    };
  }
});
</script>

In this example, we use the ref function to create a reactive reference to a number. The increment function modifies the value of this reference. TypeScript can infer the type of count based on its initial value, providing type safety throughout the component.

Integrating TypeScript with Vuex

Vuex is a state management pattern and library for Vue applications. It serves as a centralized store for all components in an application, with rules ensuring that the state can only be mutated in a predictable fashion. Integrating TypeScript with Vuex can enhance the type safety of your state management logic.

To use TypeScript with Vuex, you can define typed interfaces for your state, getters, mutations, and actions. Here's an example:

// store.ts
import { createStore } from 'vuex';

interface State {
  count: number;
}

const store = createStore<State>({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  actions: {
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment');
      }, 1000);
    }
  },
  getters: {
    doubleCount(state) {
      return state.count * 2;
    }
  }
});

export default store;

In this example, we define a State interface to describe the shape of our Vuex state. This interface is used to type the store, ensuring that TypeScript can provide type safety and autocompletion for the state, getters, mutations, and actions.

Conclusion

Using TypeScript with Vue offers numerous benefits, including improved type safety, better tooling, and enhanced code maintainability. By setting up TypeScript in your Vue projects, defining typed props and events, leveraging the Composition API, and integrating with Vuex, you can create robust and scalable applications with confidence.

As TypeScript continues to grow in popularity, its integration with Vue is likely to become even more seamless and powerful, making it an excellent choice for modern web development.

Now answer the exercise about the content:

What is one of the main benefits of using TypeScript with Vue.js as mentioned in the text?

You are right! Congratulations, now go to the next page

You missed! Try again.

Article image TypeScript for Node.js Development

Next page of the Free Ebook:

68TypeScript for Node.js Development

7 minutes

Earn your Certificate for this Course for Free! by downloading the Cursa app and reading the ebook there. Available on Google Play or App Store!

Get it on Google Play Get it on App Store

+ 6.5 million
students

Free and Valid
Certificate with QR Code

48 thousand free
exercises

4.8/5 rating in
app stores

Free courses in
video, audio and text