小言_互联网的博客

ts语法如何在Vue3中运用?

316人阅读  评论(0)

一、父子传值的用法

父传子:defineProps的TS写法


  
  1. // 父组件:和 vue2 一样正常传值
  2. <template>
  3. <div class="login-page">
  4. <cp-nav-bar title="登录" right-text="注册"> </cp-nav-bar>
  5. </div>
  6. </template>

  
  1. // 子组件:接收
  2. <script setup lang= "ts">
  3. import { defineProps } from 'vue'
  4. const props = defineProps<{
  5. title: string
  6. rightText?: string // ?表示可传可不传
  7. }>()
  8. // js中使用
  9. console. log(props. title)
  10. </script>
  11. <template>
  12. <!-- 模板中直接使用变量名 -->
  13. <van-nav-bar
  14. fixed
  15. left-arrow
  16. :title= "title"
  17. :right-text= "rightText"
  18. > </van-nav-bar>
  19. </template>

补充:

如果需要给 props 设置默认值,需要使用 withDefaults 函数:


  
  1. const props = withDefaults(defineProps<{
  2. title?: string
  3. rightText?: string
  4. }>(),{
  5. title: '首页'
  6. })
  7. // 以上代码通过语法糖解构,可以优化成如下代码:
  8. const { title, title= "首页" } = defineProps<{
  9. title?: string
  10. rightText?: string
  11. }>();

子传父:defineEmits的TS写法


  
  1. // 子传
  2. const emit = defineEmits<{
  3. ( e: 'changeMoney', money: number): void
  4. ( e: 'changeCar', car: string): void
  5. }>()
  6. // 父组件:和 vue2 一样正常接收
  7. // @changeMoney="方法名"

二、ref/reactive的TS用法

1.简单数据类型可以不定义ts类型

ref() 会隐式的依据数据推导类型


  
  1. // const money = ref<number>(10)
  2. const money = ref( 10)

 2.如果是复杂类型,建议用泛型


  
  1. type Todo = {
  2. id: number
  3. name: string
  4. done: boolean
  5. }
  6. const list = ref< Todo[]>([])
  7. list. value = [
  8. { id: 1, name: '吃饭', done: false },
  9. { id: 2, name: '睡觉', done: true }
  10. ]

三、computed的TS用法 

推荐泛型,一行搞定

const total = computed<string>(() => (count.value * 2).toFixed(2));

四、非空断言

1.可选链


  
  1. <script setup lang= "ts">
  2. import { onMounted, ref } from 'vue';
  3. const input = ref< HTMLInputElement | null >( null)
  4. onMounted( ()=>{
  5. // 如果获取的元素不是input,就可能没有value值
  6. console. log(input. value?. value);
  7. })
  8. </script>
  9. <template>
  10. <div>App组件 </div>
  11. <input type="text" ref="input" value="abc">
  12. </template>

2.非空断言


  
  1. // 一定要确定不为空!!!
  2. console. log(input. value!. value)
  3. input. value!. value = '123'

五、自定义TypeScript类型声明文件

1.给JS文件提供类型

在导入 .js 文件时,TS 会自动加载与 .js 同名的 .d.ts 文件,以提供类型声明。

具体步骤如下:

1.declare 关键字:用于类型声明,为其他地方(比如,.js 文件)已存在的变量声明类型,而不是创建一个新的变量。

2.对于 type interface 等这些明确就是 TS 类型的(只能在 TS 中使用的),可以省略 declare 关键字。

3.其他 JS 变量,应该使用 declare 关键字,明确指定此处用于类型声明。


  
  1. // 参考示例:自定义组件的类型,必须是同名的.d.ts文件
  2. import CpIcon from '@/components/CpIcon.vue'
  3. declare module 'vue' {
  4. interface GlobalComponents {
  5. CpIcon: typeof CpIcon
  6. }
  7. }

 

 2.共享类型

如果多个 .ts 文件中都用到同一个类型,此时可以创建 .d.ts 文件提供该类型,实现类型共享。

1.创建 index.d.ts 类型声明文件。

2.创建需要共享的类型,并使用 export 导出(TS 中的类型也可以使用 import/export 实现模块化功能)。

3.在需要使用共享类型的 .ts 文件中,通过 import 导入即可(.d.ts 后缀导入时,直接省略)。


转载:https://blog.csdn.net/weixin_48082900/article/details/129131324
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场