Vue3.2 运行时类型检测和运用ts特性的编译时类型检测

在Vue3内,我们可以在script标签里的export default里添加defineProps这样可以进行一种运行时的声明。

运行时声明的写法:

<template >
    <h1>我是DefineProps-Runtime</h1>
    <h3>你好{{ name }} 现在是{{ time }} 年</h3>
</template>
<script setup>

defineProps({

    name: {
        type: String,
        required: true
    },
    time: {
        type: String,
        required: true
    }

})
</script>
<style lang="">
    
</style>

defineProps会对将要传入组件的值进行类型限制,但是这个限制时在运行时候执行的。所以即使不对变异也会通过并且如果运行的时候不对并不会影响,而只是会在控制台上报一个错。

编译时类型检测——利用的是vue支持ts的特性

我们在script标签里声明lang="ts"这样就可以使用ts的特性来对props进行限制了。

<template >
    <h1>我是DefineProps-Runtime</h1>
    <h3>
        你好
        <h1>{{ title }}</h1>
        现在是{{ time }} 年
    </h3>
    <li v-for="item in list" :key="item">{{ item }}</li>
</template>
<script setup lang="ts">
const props = defineProps<{
    title?: string,
    // 这里是编译时判断
    time?: number,
    list: number[]
}>()
console.log(props);
// withDefaults宏命令

// defineProps和ts的类型约束不可以同时存在
// defineProps({

//     name: {
//         type: String,
//         required: true
//     },
//     time: {
//         type: String,
//         required: true
//     }

// })
</script>

我们其实是使用了ts里的泛型约束来达到这种功能的。我们都知道ts 的类型检测是在编译过程进行的所以如果类型检测不对的话,就会无法执行。

从语法上来看,其实就是对defineProps的函数的入参进行了类型限制。

我们也许会发现区别,那就是vue里面的运行时类型检测可以做到不传值的情况下赋默认值,但是ts的语法里不可以这样做,并且如果两种方法同时使用会报错!那么我们如何在使用ts编译时检测类型的方法,同时完成赋予默认值呢?

withDefault

我们这样写:

const props = withDefault(defineProps<{
    title?: string,
    // 这里是编译时判断
    time?: number,
    list: number[]
}>(),{
    title: '我是default 默认值',
    time: 2001,
})

这样就实现了。

其实withDefault是vue3里封装的一个宏指令,也就说明尤雨溪大大肯定也意识到了这个问题,所以特地为我们封装了一个方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值