首页 > 其他分享 ># 类型断言

# 类型断言

时间:2023-12-26 11:00:58浏览次数:26  
标签:return 断言 number length 类型 any

类型断言

参考资料:https://ts.xcatliu.com/basics/type-assertion.html

类型断言(Type Assertion)可以用来手动指定一个值的类型。

案例

比如说我们有一个案例:定义一个函数,获取到一个数组或者字符串的长度

OK,接下来编写代码:

// 定义一个函数,获取到一个数组或者字符串的长度
function getLength(x: string | number): number {
  return x.length
}

这样子就是先了这个功能,但是会有一个问题,就是,.length 方法是字符串特有的,对于数字来说,没有这个方法,因此在传入数字的时候,会报错,所以 ts 不允许这样写,会报错。

在这里插入图片描述

也就是说,如果使用联合声明的话,里面的结构体只能使用两个声明类型的共有方法,字符串和数字共有的一个方法是 .toString() 方法转为字符串,所以说我们可以使用一下:

// 定义一个函数,获取到一个数组或者字符串的长度
function getLength(x: string | number): number {
  return x.toString().length
}

这样就是可以的了,不会引发 ts 校验错误问题:

在这里插入图片描述
所以我们可以测试一下子,编译完成执行一下操作,是不会有问题的。

// 定义一个函数,获取到一个数组或者字符串的长度

function getLength(x: string | number): number {
  return x.toString().length
}
console.log(getLength("123456"));
console.log(getLength(123456));

看一下结果:

在这里插入图片描述

没有任何问题!

还有一个解决办法,就是我们先判断传进来的数据有没有 .length 方法,如果有就返回 .length,如果没有在调用 .toString() 方法再返回。

function getLength(x: string | number): number {
  if (x.length) {
    return x.length
  } else {
    return x.toString().length
  }
}

但是我们发现,其实也是不行的,和上面的问题一样,就是 .length 的时候,他不敢保证你穿进来的参数就是有的,所以语法校验直接不通过。

在这里插入图片描述

这个时候我们就需要使用今天要说的 类型断言,手动指定一个类型。

类型断言

类型断言有两种方法:

  • 变量 as 类型
  • <类型>变量

注意:在 tsx 语法(React 的 jsx 语法的 ts 版)中必须使用前者,即 值 as 类型。

我们用变量 as 类型这个方法修改一下上面案例代码,指定一下内容:

在这里插入图片描述

看,我们在第一个地方指定了之后,已经不会报错了,但是后面没有指定的地方依旧在报错。

好,下面我们使用<类型>变量的方式断言后面的内容:

在这里插入图片描述

这样我们就使用断言,指定了参数的类型。

将任何一个类型断言为 any 类型

现在,我们想在 window 上面添加一个 a 属性赋值为10

window.a = 10

理论上这样写是没有问题的,但是我们看 ts 的处理结果。

在这里插入图片描述

他给我们报错了。他说 window 上面没有 a 属性,确实哈,确实没有,但是老子写的代码老子不晓得嘛!老子今天就是想给 window 上添加一个 a 属性的!凭啥不让老子添加!

不让添加没办法,我们就给 window 断言成 any 类型:

(window as any).a = 10

好的,不报错了:

在这里插入图片描述

因为 any 类型是允许我们访问任何属性和方法的!所以有没有这个属性,有没有这个方法它不晓得,都让添加和操作,当然这是 any 类型的优点,相当灵活,确实也是他的一个缺点,太灵活,没有制约了。

注意一点:将一个变量断言为 any 可以说是解决 TypeScript 中类型问题的最后一个手段。它极有可能掩盖了真正的类型错误,所以如果不是非常确定,就不要使用 as any

总之,一方面不能滥用 as any,另一方面也不要完全否定它的作用,我们需要在类型的严格性和开发的便利性之间掌握平衡(这也是 TypeScript 的设计理念之一),才能发挥出 TypeScript 最大的价值。

有一句话说得好:如果老是用 any 的话,我还用 ts 干什么!直接 js 走起啊! 啊哈哈哈哈,很有道理!

将 any 断言为一个具体类型

比如下面我有一段代码,存在一个函数,函数的目的是两参数相加,返回相加结果,但是传入的参数包括返回值都是 any 类型:

function abc(x:any, y:any):any {
  return x + y
}
let a = abc(1, 2)

你看哈,我们调用方法传进去的参数都是数值类型,那我们想返回的数据也就是得到的 a 也是数值类型,那么我们可以添加断言,规定返回我数值类型的返回值,也就是返回我确定的类型:

function abc(x:any, y:any):any {
  return x + y
}
let a = abc(1, 2) as number

这时候把鼠标一上去,发现 a 的类型变成 number 类型了。

在这里插入图片描述

如果想得到字符串,我们可以断言成字符串类型,毕竟我们已经确认我们传进去的是啥类型里:

function abc(x:any, y:any):any {
  return x + y
}
let a = abc(1, 2) as number
let b = abc("1", "2") as string

OK,就是这个样子。

标签:return,断言,number,length,类型,any
From: https://www.cnblogs.com/wjw1014/p/17927659.html

相关文章

  • 安装go-icp_cython-master报错error C2371: “int8_t”: 重定义;不同的基类型
    库链接:aalavandhaann/go-icp_cython:用于全局最优3D点集配准的Go-ICP(github.com)解决方法:找到matrix.hpp文件,用记事本打开,在__int8之前加入signed,然后保存。 ......
  • drf之断言、请求、响应
    反序列化校验源码分析反序列化校验,什么时候,开始执行校验(切入点) -视图类中的ser.is_valid(),就会执行校验,校验通过返回True,不通过返回False入口:ser.is_valid()是序列化类的对象,假设序列化类是BookSerializer---》我们在他的内部找is_valid---》找不到,找到父类的父类BaseSer......
  • 软件测试/测试开发|常见软件测试框架类型:TDD、BDD、DDD、ATDD、DevOps介绍
    前言当今软件开发领域中,测试是确保代码质量和功能稳定性的关键步骤。而测试框架是在软件开发过程中使用的工具,有助于组织、管理和执行测试。在这篇文章中,我们将介绍几种常见的测试框架类型:TDD(测试驱动开发)、DDT(数据驱动测试)、BDD(行为驱动开发)和ATDD(行为驱动开发)以及DevOps,本文就给......
  • Python中的变量是什么?数据类型又有哪些?
    Python语言的基础构成要素:变量与数据类型。因为不仅是Python,变量与数据类型可以说是所有编程语言的核心。掌握了语言的变量与数据类型的体系,可以说就掌握了这门语言的一大半儿。1、什么是变量我们都知道应用程序在运行阶段的数据存放在内存中,那实现应用程序的编程语言是怎么操......
  • # 函数类型
    函数类型在JavaScript中,有两种常见的定义函数的方式——函数声明(FunctionDeclaration)和函数表达式(FunctionExpression)。在js中,定义一个函数有一下两种方式://函数声明命名函数functionadd(x,y){returnx+y;}//函数表达式匿名函数letmyAdd=function(x,......
  • python枚举类型Enum
    在Python中,枚举类型可以通过enum模块来实现。enum模块提供了Enum类,用于创建具有命名值的枚举类型。枚举类型的创建方式包括使用类定义、使用函数和使用装饰器。1.定义一个枚举类fromenumimportEnumclassWeekday(Enum):MONDAY=1TUESDAY=2WE......
  • # TypeScript 类型声明、数据类型
    TypeScript类型声明、数据类型好烦数据类型JavaScript的类型分为两种:原始数据类型(Primitivedatatypes)和对象类型【引用数据类型】(Objecttypes)。原始数据类型包括:布尔值、数值、字符串、null、undefined以及ES6中的新类型Symbol和ES10中的新类型BigInt。类型声......
  • vscode打开vue3,报红,ts类型找不到问题
    vscode不用禁用原有的插件Veyur和javascriptVue之前vscode检测到vue3,自动推荐安装了VueLanguageFeature(Volar),但用它扔有类型报错。官方推荐,使用它时禁用Vetur,以免有冲突。只需安装TypeScriptVuePlugin(Volar)并且打开,设置中的命令面板,快捷键f1,搜索type:select,选......
  • 强大的VS插件CodeRush全新发布v23.2——支持并发.NET类型
    CodeRush是一个强大的VisualStudio.NET插件,它利用整合技术,通过促进开发者和团队效率来提升开发者体验。CodeRush能帮助你以极高的效率创建和维护源代码。Consume-first申明,强大的模板,智能的选择工具,智能代码分析和创新的导航以及一个无与伦比的重构集,在它们的帮助下能够大大的......
  • 数据映射优秀实践:类型、方法和工具的简要指南
    在软件应用程序之间映射数据是一个耗时的过程,这需要进行深入的准备,对数据源和目标有较好的理解,并要根据方法进行实际开发。在任何应用程序集成、数据迁移以及一般的数据管理计划中,数据映射都是最关键的步骤之一。甚至可以这么认为:集成项目的成功在很大程度上取决于源数据到目标数......