TS系列之any与unknown详解,示例

news2024/11/25 15:43:50

文章目录

  • 前言
  • 一、一个示例
  • 二、示例目的
    • 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 + str2
    return 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.coloradmin.cn/o/650098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

patroni+etcd+antdb高可用

patronietcdantdb高可用架构图 Patroni组件功能 自动创建并管理主备流复制集群&#xff0c;并且通过api接口往dcs(Distributed Configuration Store&#xff0c;通常指etcd、zookeeper、consul等基于Raft协议的键值存储)读取以及更新键值来维护集群的状态。键值包括集群状态、…

MySQL ibdata1 文件“减肥”记

夏天来了&#xff0c;没想到连 ibdata1 文件也要开始“减肥”了~ 作者&#xff1a;杨彩琳 爱可生华东交付部 DBA&#xff0c;主要负责 MySQL 日常问题处理及 DMP 产品支持。爱好跳舞&#xff0c;追剧。 本文来源&#xff1a;原创投稿 有句话是这么说的&#xff1a;“在 InnoDB…

深入分析 Java IO (一)概述

目录 一、前言 二、基于字节操作的接口 2.1、字节输入流 2.2、字节输出流 三、基于字符操作的接口 3.1、字符输入流 3.2、字符输出流 四、字节与字符的转化 4.1、输入流转化过程 4.2、输出流转化过程 五、基于磁盘操作的接口 六、基于网络操作的接口 6.1、Socket简…

接口自动化测试框架?你真的会封装吗?自动化框架几大功能专项...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 当准备使用一个接…

项目经理如何做好时间管理?

1、建立时间管理原则 &#xff08;1&#xff09;我们需要通过时间日志的方式对时间进行记录和分析&#xff0c;并对日常要处理的事务进行优先级排序&#xff0c;优先处理最重要的事物&#xff1b; &#xff08;2&#xff09;确定待处理事物的机会成本&#xff0c;提高时间使用…

建模助手618 | 谁不囤点Revit插件我都会生气!

大家好&#xff0c;这里是建模助手。 早在5月份&#xff0c;我们已经就“618”这个事情高调了一番&#xff0c;以提前放“价”的姿势&#xff0c;让许多用户以躺赢的状态拉开了年中大促的序幕。&#xff08;5月购买的盆友&#xff0c;切记看完全文&#xff0c;内附彩蛋 活动反…

Canal实现0侵入同步缓存数据

开启MySQL binlog功能 cd /home/mysql8/conf vim my.cnf [mysqld] log-bin/var/lib/mysql/mysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server_id1 # 配置 MySQL replaction 需要定义&#xff0c;不要和 canal 的 slaveId 重复 binlog-do-dbimooc-hire-dev # …

冰冰学习笔记:简单了解protobuf

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

Fiddler(Statistics、Inspectors)详解

一、Fiddler Statistics详解 Fiddler的 Statistics 分页会统计请求和响应的一些信息。可以使用它完成简单的性能测试&#xff0c;查看其接口的响应时间。 如果你想学习Fiddler抓包工具&#xff0c;我这边给你推荐一套视频&#xff0c;这个视频可以说是B站播放全网第一的Fiddle…

Java 网络编程 —— RMI 框架

概述 RMI 是 Java 提供的一个完善的简单易用的远程方法调用框架&#xff0c;采用客户/服务器通信方式&#xff0c;在服务器上部署了提供各种服务的远程对象&#xff0c;客户端请求访问服务器上远程对象的方法&#xff0c;它要求客户端与服务器端都是 Java 程序 RMI 框架采用代…

提升安全性与合规性的关键工具ADAudit Plus

在当今数字化时代&#xff0c;企业对于安全性和合规性的要求越来越高。特别是在Active Directory&#xff08;AD&#xff09;域中&#xff0c;作为组织的核心身份验证和访问管理系统&#xff0c;审计活动的重要性变得前所未有。为了满足这一需求&#xff0c;ADAudit Plus成为了…

TwinCAT3 安装和打开项目问题记录

安装的VS版本: cn_visual_studio_professional_2015_with_update_3_x86_x64_dvd_8923256.iso 安装的TwinCAT版本: TC31-FULL-Setup.3.1.4024.29 更多的TwinCAT版本我都放在了百度云盘,有需求可以留言 4022.22 链接:https://pan.baidu.com/s/1D505FdgL7l1DAUANKb-VLg 提取…

【C++】入门基础知识详解(一)

目录 一、C关键字 二、命名空间 1、命名空间的定义 2、命名空间的使用 三、C输入&&输出 四、缺省参数 1、缺省参数的概念 2、缺省参数的分类 2.1 全缺省参数 2.2 半缺省参数 一、C关键字 我们在学习C之前&#xff0c;我相信大家大多数都对C语言多多少少都有所了解…

JMeter之__threadNum妙用:将接口查询结果列表按顺序赋值给各线程

使用JMeter做性能测试会遇到这么一个场景&#xff1a;后面的请求需要根据前面的查询列表结果通过正则表达式提取器取值后赋值&#xff0c;而后面用户的赋值必须是唯一的&#xff0c;此时该如何做&#xff1f; 如果按编程思维来说&#xff0c;这个问题并不难。只需要把前面的结…

Azkaban搭建与使用

下载最新azkaban源文件&#xff1a;https://github.com/azkaban/azkaban/releases 集群模式安装 1.解压 azkaban-db-3.84.4.tar.gz、 azkaban-exec-server-3.84.4.tar.gz 和 azkaban-web-server-3.84.4.tar.gz 到/opt/install/azkaban 目录下 linux>tar -zxvf azkaban-db-3…

算法:静态查找表

查找表&#xff08;Search table&#xff09;是由同一类型的数据元素&#xff08;或记录&#xff09;构成的集合。关键字(key)是数据元素中某个数据项的值&#xff0c;又称为键值&#xff0c;用它可以表示一个数据元素&#xff0c;也可以标识一个记录的数据项&#xff08;字段&…

当深度学习撞上高性能计算,科研仿佛坐上了加速器

今天深度学习无处不在&#xff0c;当你打开移动终端的时候&#xff0c;各种APP会推荐到你喜欢的食物、你喜欢的电影&#xff0c;你关注的新闻热点。在生活中更是改变着我们&#xff0c;今天的智能语音让语言障碍破除&#xff0c;在预测疾病基因大数据领域预测疾病来确定药物治疗…

2023年大学生就业怎么样?双一流高校就业率仅15%,到底是咋了?

2023年&#xff0c;大学毕业生就业状况如何&#xff0c;一直是社会关注的焦点。尤其是中国的双一流高校&#xff0c;以其优越的教学与研究背景和实力&#xff0c;被众多年轻人视为就业的理想选择。 然而&#xff0c;在最新的统计数据中&#xff0c;这些一流高校的就业率却惊人…

欧科云链OKLink全新推出Onchain AML服务 助力新金融合规健康发展

据香港大公报报道&#xff0c;为期两天的全球高端经济峰会2023格林威治经济论坛(GreenwichEconomicForum&#xff0c;下称GEF论坛)于6月15日在香港交易所举办&#xff0c;欧科云链控股有限公司&#xff08;下称“欧科云链”&#xff0c;股票代码&#xff1a;01499.HK&#xff0…

【北邮国院大三下】Logistics and Supply Chain Management 物流与供应链管理 Week4

北邮国院大三电商在读&#xff0c;随课程进行整理知识点。仅整理PPT中相对重要的知识点&#xff0c;内容驳杂并不做期末突击复习用。个人认为相对不重要的细小的知识点不列在其中。如有错误请指出。转载请注明出处&#xff0c;祝您学习愉快。 如需要pdf格式的文件请私信联系或…