关于unknow
来源:1-1 都2022了,还不抓紧学TypeScript?
松树下的熊猫
2023-03-16
老师我有个问题,比如我去localstorage里的缓存数据,这个时候数据可能是null 也可能是 string ,然后我在vue3中写了如下代码
pinia状态管理中的代码:
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', () => {
// 将关于用户数据的逻辑处理包裹在一个方法内 通过return导出对应的变量和数据 方便管理
const userInfoFun = ()=>{
interFace UserInfo{
[key:string]:any
dot:{
dotId:string|number
}
}
let userInfo:unknown = localStorage.getItem('userInfo')
if(typeof userInfo === 'string'){
userInfo = reactive(JSON.parse(userInfo)) //指向unknown
}else{
userInfo = reactive<UserInfo>({dot:{dotId:''}}) //依然指向unknown
}
async function getUserInfo(){
const params = {...}
try{
const res = await axiosUserInfo(params)
Object.assign(userInfo,res.data)
}catch(err){
throw err
}
}
//通过action 修改 userInfo的值
function setUserInfo(data){
Object.assign((userInfo as UserInfo),data)
}
return {userInfo,getUserInfo}
}
const {userInfo,getUserInfo,setUserInfo} = userInfoFun()
return {userInfo,getUserInfo,setUserInfo}
})
我的问题就是,定义unknown类型后的变量 使用的时候难道只能用 类型断言 (userInfo as UserInfo )来强制改变变量的数据类型吗?目前我在项目中,使用pinia(vuex 5)将改数据导出至组件后,如果不使用类型断言,在template中使用 {{userInfo.name}} 会提示unknown中不存在该属性,这让我感觉非常麻烦,也我怀疑是不是自己写的不太对,所以我想请教下老师,对于这种情况,有没有更好的写法。
Vue文件中的代码:
<template>
<div>{{userInfo.name}}</div> //使用pinia提供的storeToRefs方法导出UserInfo或者在computed中不使用类型断言 会 提示unknown中不存在name属性
</template>
<script lang="ts" setup>
import { useCounterStore } from '@/lib/store'
import { computed } from 'vue'
import { storeToRefs } from 'pinia' //storeToRefs是pinia提供的方法 能将pinia中的数据全部改变为响应式数据
// const {userInfo} = storeToRefs(counter) //无法使用
const counter = userCounterStore()
const userInfo = computed(()=>{
return (counter.userInfno as UserInfo)
})
</script>
顺带还有个问题老师,Vue3中,没有办法直接对响应式变量直接赋值吗?
例如
let abc = reactive({ a:1,b:2,c:3 })
abc = {} //直接赋值后失去响应式
//百度到的 替代方法
let abc = reactive({ keyName:{ a:1,b:2,c:3 }}) //在数据外面再包一层对象,修改对象里面的数据不会失去响应式
abc.keyName = {}
//个人使用觉得不习惯所以 使用 OBject.assign() 来替代
Object.assign(abc,{})
写回答
1回答
-
Dell
2023-03-19
用 unknown 不太合适,你这里最好是定义好 userInfo 的数据结构,有可能是 null 或者一个对象类型,使用一个联合类型来表示。
你写的后面这两种是可以的,对象里面加东西,自带响应式
00
相似问题
关于 superagent.get
回答 1
关于扩展express 类型的问题
回答 1
关于static的问题
回答 1
关于interface定义时属性名的问题
回答 1
关于在函数中使用keyof的疑惑
回答 1