TS中any与unknown详解,示例

news2024/11/25 18:26:44

文章目录

  • 前言
  • 一、一个示例
  • 二、示例目的
    • 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/638869.html

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

相关文章

2023年最新网络安全入门指南,保姆级教程!啃完这篇就够了

一、网络安全学习的误区 1.不要试图以编程为基础去学习网络安全 不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;且过渡到网络安全用到编程的用到的编程的关键点不多。一般人如果想要把编程学好再开始学习网络安全往…

大气污染扩散模型Calpuff教程

详情点击链接&#xff1a;大气污染扩散模型Calpuff教程一&#xff0c;Calpuff 1.Calpuff模型 2、Calpuff模型基础 3、Calpuff模型下载安装 1&#xff09;Calpro系统安装 2&#xff09;安装环境要求 3&#xff09;需安装的辅助软件二&#xff0c;数据预处理 1.网格设置 …

Vue3-04-生命周期

Vue 的生命周期描述组件从创建到销毁的全过程。Vue3 和 Vue2 的生命周期钩子非常像&#xff0c;我们仍然可以在相同的场景下使用相同的钩子函数。 Vue3 在设计时对先前的版本进行了向下兼容&#xff0c;如果你的项目还在使用选项式 API 进行构建&#xff0c;那么不需要修改生命…

【stable diffusion】图片批量自动打标签、标签批量修改(BLIP、wd14)用于训练SD或者LORA模型

参考&#xff1a; B站教学视频【&#xff1a;AI绘画】新手向&#xff01;Lora训练&#xff01;训练集准备、tag心得、批量编辑、正则化准备】官方教程&#xff1a;https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_README-en.md#automatic-captioning 一、…

Springboot全文链路id,并ELK搭建部署整合全文链路id

Springboot全文链路id,并ELK搭建部署整合全文链路id 1.docker-compose.yaml部署 version: 3 services:elasticsearch:image: elasticsearch:7.13.2container_name: elasticsearchenvironment:- "cluster.nameelasticsearch" #设置集群名称为elasticsearch- "d…

[笔记]C++并发编程实战 《五》C++内存模型和原子类型操作

文章目录 前言第5章 C内存模型和原子类型操作5.1 内存模型基础5.1.1 对象和内存位置5.1.2 对象、内存位置和并发5.1.3 修改顺序 5.2 C中的原子操作和原子类型5.2.1 标准原子类型 总结 前言 第5章 C内存模型和原子类型操作 本章主要内容&#xff1a; C11内存模型详解标准库提…

【Docker】子系统与其相关名词的界定、Control Groups等详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

回收旧物系统平台开发的功能

1、定位服务 为了方便用户寻找最近的废品回收点&#xff0c;小程序应该提供位置服务和导航功能。 2、垃圾分类知识普及 用户可以查看所有垃圾分类知识&#xff0c;每种物品属于哪一个类型的垃圾分类。一目了然。相当于一本活字典&#xff0c;用户可以随时翻看查阅垃圾分类的…

人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型,一种生成对抗网络GAN的变体实际应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型11-pytorch搭建DCGAN模型&#xff0c;一种生成对抗网络GAN的变体实际应用&#xff0c;本文将具体介绍DCGAN模型的原理&#xff0c;并使用PyTorch搭建一个简单的DCGAN模型。我们将提供模型…

java+openlayer实现大气污染扩散模拟反演

一、模拟参数及效果 二、应用背景 大气污染是当今社会面临的一个重要问题。随着工业化和城市化的进程&#xff0c;大气污染问题变得越来越严重。为了更好地应对这个问题&#xff0c;许多科学家和研究人员开始探索大气污染扩散反演技术。 大气污染扩散反演技术是一种通过数学模…

给软件测试人的一封信,全网最佳“指路明灯“

一、一招鲜吃遍天下 你需要有一个核心技能。这个技能至少达到远超你的同事&#xff08;包括开发岗位的同事的&#xff09;平均水平。最好达到业界领先水平&#xff0c;且这个核心技能需要不断打磨提高。比如&#xff0c;我选择的核心技能是使用Python写代码。这个核心技能可以…

3.2 基于Java配置类整合SSM框架实现用户登录

一、基于Java配置类整合SSM框架实现用户登录 1、创建Maven项目 Maven项目 - SSMLoginNew 单击【Finish】按钮 2、添加相关依赖 在pom.xml文件里添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache…

Kubernetes 1.27 加快 Pod 启动速度

如何在大型集群中加快节点上的 Pod 启动&#xff1f;这是企业集群管理员常常会面临的问题。 这篇博文重点介绍了从 kubelet 一侧加快 Pod 启动的方法。此方法不涉及通过 kube-apiserver 由 controller-manager 创建 Pod 所用的时间段&#xff0c;也不包含 Pod 的调度时间或在其…

电脑最牛逼的截图方式

1.电脑桌面上空白的地方新建一个文本文档&#xff0c;将后缀名修改为bat&#xff0c;截图如下&#xff1a; 2.右键点击该文档编辑&#xff0c;在编辑界面输入start snippingtool&#xff0c;点击保存之后关闭该文档。 3.双击该文档&#xff0c;在模式里面选择响应的截图方式即可…

MySQL IDE与pymysql模块

一、IDE工具介绍 生产环境还是推荐使用mysql命令行&#xff0c;但为了方便我们测试&#xff0c;可以使用IDE工具 在此我们推荐使用Navicat软件或pycharm来连接数据库,这样就能更详细直观地查询数据 掌握&#xff1a; #1. 测试链接数据库 #2. 新建库 #3. 新建表&#xff0c;新增…

2023 年程序员高考试卷!你能答对几个?

又是一年高考季&#xff0c;一起来做做“程序员们的高考试卷”&#xff0c;压压惊吧~ 2023年普通高等学校招生全国统一考试 程序员的高考试卷&#xff08;A卷&#xff09; 考生类别&#xff1a;码农 1、程序员A&#xff1a;借我1000元吧。 程序员B&#xff1a;给你凑个整数…

Linux基础知识点2

Linux基础知识 适合有Linux基础的人群进行复习。 禁止转载&#xff01; 文件管理与常用命令 Linux的文件的组成部分&#xff1a; 文件名、inode(i节点)和block(真正存数据的区域)。 查看某个文件的属性&#xff1a; ls -lh #可看到有类似”-rw-r--r--”的属性符号 …

轻松来自实力,亚马逊云科技助力边界智能应对业务高峰值数据考验

边界智能&#xff08;Bianjie.AI&#xff09;是2016年创立于上海的国家高新技术企业和专精特新企业&#xff0c;同时也是以香港为全球总部、服务全球的区块链技术创新团队。公司专注于区块链技术支持的下一代互联网应用服务&#xff0c;自主研发了跨多条联盟链的分布式应用服务…

STL入门 + 刷题(下)

&#x1f442; Raindrops (Intl. Version) - Katja Krasavice/Leony - 单曲 - 网易云音乐 &#x1f442; Rush E (Playable Version) - Sheet Music Boss - 单曲 - 网易云音乐 &#x1f442; 最美的瞬间 - 真瑞 - 单曲 - 网易云音乐 &#x1f442; 你可别卷了 - SipSu小口酥…

CTF Crypto --- orz!

文章目录 题目解题过程 题目 from Crypto.Util.number import * from gmpy2 import *flag bxxx t len(flag)//3 part1 bytes_to_long(flag[:t]) part2 bytes_to_long(flag[t:2*t]) part3 bytes_to_long(flag[2*t:]) q getPrime(1024) p next_prime(q) n p * qo getPr…