举报投诉联系我们 手机版 热门标签 VUE中文网
您的位置:VUE中文网 > vue3对typescript的支持 Vue 3.0 TypeScript支持

vue3对typescript的支持 Vue 3.0 TypeScript支持

2023-02-26 06:17 VUE3教程

vue3对typescript的支持 Vue 3.0 TypeScript支持

vue3对typescript的支持

Vue3是Vue的最新版本,它支持TypeScript,这是一种强大的静态类型语言,可以帮助开发人员更好地管理代码。

TypeScript为Vue3提供了一些重要的特性,包括对ES6语法的支持、对JSX语法的支持、对装饰器的支持以及对静态类型的支持。这些特性使得Vue3能够在开发过程中获得显著的优势。

TypeScript也为Vue3带来了一些新特性,例如它具有强大的类型安全性,可以帮助开发人员避免出现不必要的错误。此外,TypeScript还具有自动补全功能,可以帮助开发人员快速定位代码中出现的问题。

此外,TypeScript还为Vue3带来了一些新特性,例如它具有强大的代码重用能力,使得开发人员能够将代码重用到不同地方。此外,TypeScript还具有自动化测试工具(Jest或Mocha),使得开发人员能够快速测试应用中出现的问题。

// 使用 TypeScript 的 Vue 组件 
import { Component, Prop } from 'vue-property-decorator' 
@Component 
export default class MyComponent extends Vue { 

    // 声明 props 
    @Prop() readonly propA!: number 

    // 声明 data 
    message: string = 'Hello' 

    // 声明 computed 
    get computedMsg(): string { 
        return 'Computed ' + this.message; 
    }

    // 声明 methods  
    greet(): string {   return 'Hello' + this.message;   }   } 

Vue CLI 提供内置的 TypeScript 工具支持。

#NPM 包中的官方声明

随着应用的增长,静态类型系统可以帮助防止许多潜在的运行时错误,这就是为什么 Vue 3 是用 TypeScript 编写的。这意味着在 Vue 中使用 TypeScript 不需要任何其他工具——它具有一流的公民支持。

#推荐配置

// tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    // 这样就可以对 `this` 上的数据属性进行更严格的推断`
    "strict": true,
    "jsx": "preserve",
    "moduleResolution": "node"
  }
}

请注意,必须包含 strict: true (或至少包含 noImplicitThis: true,它是 strict 标志的一部分) 才能在组件方法中利用 this 的类型检查,否则它总是被视为 any 类型。

参见 TypeScript 编译选项文档查看更多细节。

#开发工具

#项目创建

Vue CLI 可以生成使用 TypeScript 的新项目,开始:

# 1. Install Vue CLI, 如果尚未安装
npm install --global @vue/cli@next


# 2. 创建一个新项目, 选择 "Manually select features" 选项
vue create my-project-name


# 3. 如果已经有一个不存在TypeScript的 Vue CLI项目,请添加适当的 Vue CLI插件:
vue add typescript

请确保组件的 script 部分已将语言设置为 TypeScript:

<script lang="ts">
  ...
</script>

#编辑器支持

对于使用 TypeScript 开发 Vue 应用程序,我们强烈建议使用 Visual Studio Code,它为 TypeScript 提供了很好的开箱即用支持。如果你使用的是单文件组件 (SFCs),那么可以使用很棒的 Vetur extension,它在 SFCs 中提供了 TypeScript 推理和许多其他优秀的特性。

WebStorm 还为 TypeScript 和 Vue 提供现成的支持。

#定义 Vue 组件

要让 TypeScript 正确推断 Vue 组件选项中的类型,需要使用 defineComponent 全局方法定义组件:

import { defineComponent } from "vue"


const Component = defineComponent({
  // 已启用类型推断
})

#与 Options API 一起使用

TypeScript 应该能够在不显式定义类型的情况下推断大多数类型。例如,如果有一个具有数字 count property 的组件,如果试图对其调用特定于字符串的方法,则会出现错误:

const Component = defineComponent({
  data() {
    return {
      count: 0
    }
  },
  mounted() {
    const result = this.count.split("") // => Property "split" does not exist on type "number"
  }
})

如果你有一个复杂的类型或接口,你可以使用 type assertion 对其进行强制转换:

interface Book {
  title: string
  author: string
  year: number
}


const Component = defineComponent({
  data() {
    return {
      book: {
        title: "Vue 3 Guide",
        author: "Vue Team",
        year: 2020
      } as Book
    }
  }
})

#注释返回类型

由于 Vue 声明文件的循环特性,TypeScript 可能难以推断 computed 的类型。因此,你可能需要注释返回类型的计算属性。

import { defineComponent } from "vue"


const Component = defineComponent({
  data() {
    return {
      message: "Hello!"
    }
  },
  computed: {
    // 需要注释
    greeting(): string {
      return this.message + "!"
    }


    // 在使用setter进行计算时,需要对getter进行注释
    greetingUppercased: {
      get(): string {
        return this.greeting.toUpperCase();
      },
      set(newValue: string) {
        this.message = newValue.toUpperCase();
      },
    },
  }
})

#注释 Props

Vue 对定义了 type 的 prop 执行运行时验证。要将这些类型提供给 TypeScript,我们需要使用 PropType 强制转换构造函数:

import { defineComponent, PropType } from "vue"


interface ComplexMessage {
  title: string
  okMessage: string
  cancelMessage: string
}
const Component = defineComponent({
  props: {
    name: String,
    success: { type: String },
    callback: {
      type: Function as PropType<() => void>
    },
    message: {
      type: Object as PropType<ComplexMessage>,
      required: true,
      validator(message: ComplexMessage) {
        return !!message.title
      }
    }
  }
})

如果你发现验证器没有得到类型推断或者成员完成不起作用,那么用期望的类型注释参数可能有助于解决这些问题。

#与组合式 API 一起使用

setup() 函数中,不需要将类型传递给 props 参数,因为它将从 props 组件选项推断类型。

import { defineComponent } from "vue"


const Component = defineComponent({
  props: {
    message: {
      type: String,
      required: true
    }
  },


  setup(props) {
    const result = props.message.split("") // 正确, "message" 被声明为字符串
    const filtered = props.message.filter(p => p.value) // 将引发错误: Property "filter" does not exist on type "string"
  }
})

#类型声明 ref

Refs 根据初始值推断类型:

import { defineComponent, ref } from "vue"


const Component = defineComponent({
  setup() {
    const year = ref(2020)


    const result = year.value.split("") // => Property "split" does not exist on type "number"
  }
})

有时我们可能需要为 ref 的内部值指定复杂类型。我们可以在调用 ref 重写默认推理时简单地传递一个泛型参数:

const year = ref<string | number>("2020") // year"s type: Ref<string | number>


year.value = 2020 // ok!

TIP

如果泛型的类型未知,建议将 ref 转换为 Ref<T>

#类型声明 reactive

当声明类型 reactive property,我们可以使用接口:

import { defineComponent, reactive } from "vue"


interface Book {
  title: string
  year?: number
}


export default defineComponent({
  name: "HelloWorld",
  setup() {
    const book = reactive<Book>({ title: "Vue 3 Guide" })
    // or
    const book: Book = reactive({ title: "Vue 3 Guide" })
    // or
    const book = reactive({ title: "Vue 3 Guide" }) as Book
  }
})

#类型声明 computed

计算值将根据返回值自动推断类型

import { defineComponent, ref, computed } from "vue"


export default defineComponent({
  name: "CounterButton",
  setup() {
    let count = ref(0)


    // 只读
    const doubleCount = computed(() => count.value * 2)


    const result = doubleCount.value.split("") // => Property "split" does not exist on type "number"
  }
})
阅读全文
以上是VUE中文网为你收集整理的vue3对typescript的支持 Vue 3.0 TypeScript支持全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • vue的状态管理 Vue 3.0 状态管理

    vue的状态管理 Vue 3.0 状态管理

    2023-02-27 VUE3教程

    类 Flux 状态管理的官方实现由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长。为了解决这个问题...

  • vue语义化 Vue 3.0 语义学

    vue语义化 Vue 3.0 语义学

    2023-02-25 VUE3教程

    #表单当创建一个表单,你可能使用到以下几个元素:form、label、input、textarea 和 button。标签通常放置在表单字段的顶部或左...

  • vue3.0ui Vue 3.0 标准

    vue3.0ui Vue 3.0 标准

    2023-02-26 VUE3教程

    万维网联盟 (W3C) 网络可访问性倡议 (WAI) 为不同的组件制定了 Web 可访问性标准:用户代理无障碍指南 (UAAG)网络浏览器和媒体播...

  • vue3.0实战 Vue 3.0 介绍

    vue3.0实战 Vue 3.0 介绍

    2023-02-23 VUE3教程

    INFO刚接触 Vue.js?先从基础指南开始吧。本指南主要是为有 Vue 2 经验的用户希望了解 Vue 3 的新功能和更改而提供的。在试用 Vu...

  • vue中ref的用法 Vue 3.0 v-for中的Ref数组

    vue中ref的用法 Vue 3.0 v-for中的Ref数组

    2023-02-28 VUE3教程

    在 Vue 2 中,在 v-for 里使用的 ref attribute 会用 ref 数组填充相应的 $refs property。当存在嵌套的 v-for 时,这种行为会变...

© 2024 VUE中文网 vue88.com 版权所有 联系我们