- vue3 ts setup写法,反对全局变量提醒。
vue3 ts版本通过app.config.globalProperties挂载全局变量,一些插件也会在此装置全局可用的变量。参考官文:https://cn.vuejs.org/api/application.html#app-config-globalpr...,然而挂载的变量没有类型定义,被当作了any类型,无奈通过ctrl查看变量下的属性和办法。
上面是在main.ts里挂载全局变量,鼠标放到变量上发现是any类型:
在component里应用挂载的变量,无奈辨认挂载的变量类型:
全局挂载的变量无奈辨认类型,因而无奈提供代码提醒, 也不利于代码重构,谬误查看等。须要给全局变量建设类型关联,上面是vue的解决形式:vue通过利用ts的模块扩大个性,给挂载的变量指定类型,参考官文:https://cn.vuejs.org/guide/typescript/options-api.html#augmen...
globalProperties是ComponentCustomProperties类型,原生是没有咱们挂载下来的变量的,因而用上面的形式扩大这个类型定义:
在src下写一个d.ts的类型定义文件,依照官网的文档扩大类型定义,至此$bus $api被扩大到了ComponentCustomProperties类型里,proxy就是ComponentCustomProperties类型,有了关联关系,代码提醒就有了。
一些vue专用的插件或者库,个别会在本人的d.ts里定义vue的扩大类型,如pinia.d.ts定义了反对vue2及vue3的扩大类型:
- 上面解决下setup模式下proxy提醒问题:
setup模式下须要通过proxy拜访全局变量,在ts里援用proxy须要解决代码提醒问题,这样写在js中没有问题:
在ts里会正告proxy不存在,这是ts的联结类型导致的,proxy是ComponentInternalInstance下的属性,但getCurrentInstance返回的可能是null。
这个正告能够疏忽,也能够强转为any类型,但这样就无奈利用ts的提醒能力了。要利用ts的提醒能力须要强转为类型ComponentInternalInstance:
const { proxy } = getCurrentInstance() as ComponentInternalInstance ;
import的正告打消了,不过代码里应用的中央还有正告:
proxy可能存在也可能不存在,因而须要用可选链操作符改下代码:
至此用上了ts的类型提醒,打消了所有正告。不过每个proxy后须要跟个可选链操作符,这让人感觉不爽,上面的办法能够解决这种问题:
引入proxy时抉择上面两种写法之一即可,都是比拟举荐的写法:
import { onMounted, onUnmounted, ref, reactive, getCurrentInstance, ComponentInternalInstance, ComponentPublicInstance } from 'vue';// 写法一:应用可选链操作符 + 强转类型const proxy = getCurrentInstance()?.proxy as ComponentPublicInstance;或者:// 写法二:2次强转类型const proxy = (getCurrentInstance() as ComponentInternalInstance).proxy as ComponentPublicInstance;
至此齐全反对了ts,有了代码提醒,类型查看。ts的类型查看,联结类型的确比拟麻烦,须要消耗不少精力解决类型问题。