TS中any与unknown详解,示例

news/2024/11/26 21:49:40/

文章目录

  • 前言
  • 一、一个示例
  • 二、示例目的
    • 1、功能描述
    • 2、主要区别
    • 3、代码实现
  • 总结


前言

本片文章主要是在写ts时遇到不知道类型,很容易就想到用any可以解决一切,但这样写并不好。所以今天就总结学习一下,比较好的处理任意类型的unknown。


一、一个示例

光看效果图可能看不懂,跟着代码解析一起看。
在这里插入图片描述

二、示例目的

1、功能描述

这个示例主要实现了,用any类型和unknown类型的区别。

  • 切换输入框类型
  • 切换结果函数接受参数类型
  • 输入两个内容,进行结果类型判断

首先可以看到当选择输入框类型为text或者number时,并且函数接受参数类型为any时,没有任何报错和提示。
当把类型切换为unknown类型时,需要添加参数类型判断,否则会有错误提示。可以先来看看ts本身的错误提示:
在这里插入图片描述
意思时,这个参数类型是unknown类型,是未知的类型。如果你继续执行后面的代码,可能会有报错风险。
所以需要你提前添加类型判断。
例如这样:

const concatenateUnknownString = (str1: unknown, str2: unknown) => {if (typeof str1 === 'string' && typeof str2 === 'string') {return str1 + str2;} else {return `err type args1${typeof str1} args2 ${typeof str2}`;}
}

这样明确的进行判断参数类型,就可以避免运行时报错。保证类型安全。

2、主要区别

  1. any可以接受任何类型的值,而unknown也可以接受任何类型的值,但需要进行类型检查或类型断言才能使用。
  2. 具体来说,any类型可以用于任何变量或函数参数,它表示该变量或参数可以是任何类型的值。

上面的代码展示了,类型判断,以下为修改类型断言形式。

const concatenateUnknownString = (str1: unknown, str2: unknown) => {return `${str1} + ${str2}`return str1 as string + str2return Number(str1) + Number(str2)
}

3、代码实现

1、主体实现
定义:

const [textStr, setTestStr] = useState("")
const [textType, setTextType] = useState("text")
const [textTypeCheck, setTextTypeCheck] = useState<{ [key: string]: boolean }>({ text: true, number: false })
const [typeTsCheck, setTypeTsCheck] = useState<{ [key: string]: boolean }>({ any: true, unknown: false })
const [inputObj, setInputObj] = useState<inputType>({first: "",second: ""
})
const [typeTs, setTypeTs] = useState("any")

这里定义了radio的选中状态,textTypeCheck和textTsCheck,分别控制输入框文本类型和参数类型的状态。
主要逻辑部分:

const tapFn = () => {if (typeTs === "any") {setTestStr(concatenateAnyString(inputObj.first, inputObj.second))} else {setTestStr(concatenateUnknownString(inputObj.first, inputObj.second))}
}const onChangeFn = (e: ChangeEvent<HTMLInputElement>) => {setTextTypeCheck((pre) => {for (let item of Object.keys(pre)) {console.log(item)pre[item] = false}return { ...pre, [e.target.defaultValue]: e.target.checked }})setTextType(e.target.defaultValue)
}const onChangeTypeFn = (e: ChangeEvent<HTMLInputElement>) => {setTypeTsCheck((pre) => {for (let item of Object.keys(pre)) {pre[item] = false}return { ...pre, [e.target.defaultValue]: e.target.checked }})setTypeTs(e.target.defaultValue)
}const onInputFn = (value: string, valueKey: string) => {setInputObj({...inputObj,[valueKey]: textType === 'number' ? +value : value})
}

tapFn控制值得到的结果的Result部分。
onChangeFn和onChangeTypeFn为控制radio状态。
onInputFn为输入值。


总结

所以当无法确定一个变量的类型时,应该优先使用 unknown 类型,因为它能更好的保证类型安全性。除非有特殊情况需要,否则应该避免使用 any 类型。


http://www.ppmy.cn/news/350631.html

相关文章

canon lbp 5050提示未注册色彩校准失败

佳能LBP5050、LBP7200等激光打印机提示“未执行未注册颜色校正,请重新执行未注册颜色校正”的原因分析&#xff1a; 佳能LBP5050、LBP7200等激光打印机加碳粉后或更换国产代用硒鼓后上机自检时,激光打印机需要对4种颜色进行对位校准,以保证打印色彩重合。其检测校准过程是将各…

激光打印机的硒鼓寿命及加分量

序号 系列 OEM型号 适用机型 装粉量(g) 页产量(5%) 1 HP CB435A HP LaserJet P1005/P1006 100 2000 2 CB436A HP LaserJet M1120, M1120N, M1522nf, M1522n, 1505, 1505N 100 2000 3 Q2612A/ CAN CRG-303 Lserjet1010/1012/1015/3015/3020/3030 120 2…

转载--近几年的论文及其代码

https://blog.csdn.net/qq_18343569/article/details/49001065 转载出处 Newly accepted: [1] J. Xu, L. Zhang, W. Zuo, D. Zhang, and X. Feng, “Patch Group Based Nonlocal Self-Similarity Prior Learning for Image Denoising,” in ICCV 2015. (paper, sup) (co…

Ubuntu下安装Canon打印机驱动程序

今天要用到Canon LBP5050型号的佳能打印机&#xff0c;可是在ubuntu下默认安装的Canon打印机驱动程序版本过低&#xff0c;只好Google一下了&#xff0c;在佳能中国官方网站上没有Linux下的驱动&#xff0c;在英文网站上才找到&#xff0c;是看不起中国还是咋地呢。 说下怎么安…

近几年的论文和代码

Newly accepted: [1] J. Xu, L. Zhang, W. Zuo, D. Zhang, and X. Feng, “Patch Group Based Nonlocal Self-Similarity Prior Learning for Image Denoising,” in ICCV 2015. (paper, sup) (code) (From “patch” based learning to “patch group” based learning!…

树莓派开发和车牌识别

目录 如何判断树莓派型号 车牌识别 HyperLPR CPP 依赖 Linux/Mac 编译 CPP demo 还是试一试python版把 demo.py的逻辑关系 模型资源说明 实现对摄像头进行拍照 在树莓派上安装环境 ssh pip install tensorflow errer: FFFFFFFFFFFFFFFFFFFinally 如何判断树莓派…

SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation----2016 SegNet论文解读

SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation Abstract 我们提出了一种新颖实用的深度全卷积神经网络体系结构&#xff0c;用于语义像素分割&#xff0c;称为SegNet。这个核心的可训练分段引擎由一个编码器网络&#xff0c;一个相应的…

制作自己的segnet数据集_语义分割【论文解读】经典网络SegNet 值得仔细反复阅读...

摘要&#xff1a; 提出了一种新颖而实用的深度全卷积神经网络结构用于语义像素分割称为SegNet。这个核心的可训练分割引擎包括一个编码器网络&#xff0c;一个相应的解码器网络&#xff0c;以及一个像素级的分类层。编码器网络的架构与VGG16网络中的13个卷积层拓扑结构相同。解…