关于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

  1. 用 unknown 不太合适,你这里最好是定义好 userInfo 的数据结构,有可能是 null 或者一个对象类型,使用一个联合类型来表示。

  2. 你写的后面这两种是可以的,对象里面加东西,自带响应式

0
0

专为小白设计的TypeScript入门课

Dell老师专为TypeScript小白打造的,全栈式教学TS入门课程

2261 学习 · 506 问题

查看课程