TypeScript 类型断言、类型推论

news2025/7/5 22:51:59

类型断言

类型断言是一种 TypeScript 特性,用于告诉编译器将一个值视为特定的类型,即使编译器本身的类型推断可能不同。

类型断言并不会改变变量的实际运行时类型,而是在编译阶段告知TypeScript编译器开发者期望该表达式具有某种类型。

注意:类型断言 不是 类型转换,因为转换通常意味着某种运行时的支持。但类型断言纯粹是一个编译时语法,只是在编译阶段起作用,不进行特殊的数据检查和解构,它没有运行时的影响。同时,它也是一种为编译器提供关于如何分析代码的方法

语法格式:

  1. <类型>值
  2. 值 as 类型

类型断言主要用于以下情况:

  1. 当 TypeScript 的类型推断不够精确,而开发者明确知道变量的实际类型时。
  2. 当需要访问特定类型的属性或方法,但 TypeScript 由于自身的类型限制不允许直接访问时。
let someValue: any = "Hello, TypeScript!";

// 方式一:<类型>值
let length1: number = (<string>someValue).length;

// 方式二:值 as 类型
let length2: number = (someValue as string).length;

当你在TypeScript里使用JSX时,只有 as 语法断言是被允许的。

类型推断

在 TypeScript 中,类型推论允许 TypeScript 在某些情况下根据变量的初始化值自动推断出变量的类型。

类型推断发生在初始化变量和成员,设置默认参数值和决定函数返回值时。

  1. 变量初始化时的类型推论
    当声明一个变量并同时为其赋值时,TypeScript 会根据赋值的值来推断变量的类型。

示例:

let num = 5;  // TypeScript 会推断 num 的类型为 number
let isTrue = true;  // TypeScript 会推断 isTrue 的类型为 boolean
let arr = [1, 2, 3];  // TypeScript 会推断 arr 的类型为 number[]

let str = "Hello";  // TypeScript 会推断 str 的类型为 string
str = "hi"; // 合法,str 的类型为 string
str = 10;  // Error: 不能将类型“number”分配给类型“string”。

当需要从几个表达式中推断类型时候,会使用这些表达式的类型来推断出一个最合适的通用类型。

let arr = [0, 1, null];

数组 arr 中的元素包含了数字 01 ,以及 null ,所以数组元素的类型被推断为 numbernull 的联合类型,整个数组的类型就是 (number | null)[]

  1. 函数返回值的类型推论
    如果函数的返回值是通过计算得出的,并且没有显式指定返回值类型,TypeScript 会根据返回的表达式来推断函数的返回值类型。

示例:

function sum(a: number, b: number) {
  return a + b;  // TypeScript 会推断该函数的返回值类型为 number
}
  1. 对象属性的类型推论
    在对象初始化时,TypeScript 也会对对象属性进行类型推论。

示例:

// TypeScript 会推断 person 的类型为具有 name: string 和 age: number 属性的对象类型
let person = {
  name: "John",
  age: 30
}; 

// 对象字面量只能指定已知属性,并且“firstName”不在类型“{ name: string; age: number; }”中。
person = {
  firstName: "John",
  lastName: "Bob"
}

在这里插入图片描述

由于最终的通用类型取自候选类型,有些时候 候选类型 共享 相同的通用类型,但是却没有一个类型能做为所有候选类型的类型。
没有通用类型:

let zoo = [new Rhino(), new Elephant(), new Snake()];

在这种情况下,TypeScript 编译器 会根据数组中元素的实际类型来推断数组的类型。
在数组中, RhinoElephantSnake 是自定义的类,它们之间没有找到最佳通用类型,类型推断的结果为联合数组类型:(Rhino | Elephant | Snake)[]

如果想要TypeScript编译器 推断zoo的类型为Animal[],但是这个数组里没有对象是Animal类型的,因此不能推断出这个结果。
当候选类型不能作为最佳通用类型使用的时候,需要明确的指出类型:

let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];

既然TypeScript 编译器会自动判断变量的类型,那为什么还要在编写代码时明确类型声明呢?

JavaScript的变量没有类型,在运行时明确变量的值的类型。
在单纯的为变量a赋值时,a是什么类型都影响不大:a = 10a = "hello"a = true
假如a作为某个函数的参数,需要传递到函数中使用呢?

function sum(a, b) {
  return a + b;
}
console.log( sum(10, 15) );  // 25
console.log( sum("10", 15) );  // "1015"

假如要将计算结果进行展示或在别的函数里继续使用,会导致更多错误。
sum(10, 15)sum("10", 15)的计算结果相差很大,但是代码不会报错,那排查问题就会特别困难。
因此,明确声明该参数的类型可以防止意外传递错误类型的值,并且在阅读函数定义时就能清楚了解输入的预期。

function sum(a:number, b:number) {
  return a + b;
}
console.log( sum(10, 15) );  // 25
console.log( sum("10", 15) );  // Error: 类型“string”的参数不能赋给类型“number”的参数。

明确指出变量类型有以下好处:

  1. 增强代码的自解释性
    • 明确的类型声明使其他开发者在阅读代码时能更快速、清晰地理解变量的预期用途和可能的值。
  2. 提高代码的可维护性
    • 当代码规模较大或经过多人协作开发时,显式的类型有助于确保代码的一致性和规范性。
    • 未来进行代码修改和扩展时,清晰的类型信息可以降低出错的风险。
  3. 提前发现错误,增强类型安全性
    • 显式声明类型,编译器能在编译阶段检测到更多潜在的类型不匹配错误,减少潜在的运行时错误。
  4. 更好的开发工具支持
    • 开发工具可以基于明确的类型提供更准确和有用的代码提示、自动完成和重构功能。
  5. 文档化代码
    • 类型声明相当于为代码添加了一种内置的文档,方便后续开发者理解。

类型断言、类型推论的区别

类型断言

  • 手动干预:是开发者手动告诉编译器将某个值视为特定的类型,即使编译器本身的推断可能不同。
  • 显式语法:通过特定的语法 <类型>值值 as 类型 来实现。
  • 可能存在风险:如果断言不正确,可能在运行时导致错误,因为编译器在编译阶段不会深入检查断言的正确性。

类型推论(Type Inference):

  • 自动进行:TypeScript 编译器根据变量的初始化值或函数的返回值等上下文信息,自动推断出变量或返回值的类型。
  • 无需显式操作:开发者不需要进行任何特殊的语法或操作来触发类型推论,它是在编译时由编译器自动完成的。
  • 基于值:类型的推断是基于所赋的值或计算得出的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978237.html

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

相关文章

RAG:如何与您的数据对话

ChatGPT 进行主题建模&#xff0c;我们的任务是分析客户对不同连锁酒店的评论&#xff0c;并确定每家酒店提到的主要主题。通过这种主题建模&#xff0c;我们知道每个客户评论的主题&#xff0c;并且可以轻松地过滤它们并进行更深入的研究。然而&#xff0c;在现实生活中&#…

PMP--冲刺--敏捷中的角色职责与3个工件--题干关键词

文章目录 敏 捷 中 的 角 色 职 责 与 3 个 工 件--题干关键词说明题目 敏 捷 中 的 角 色 职 责 与 3 个 工 件–题干关键词 角色职责 1、产品负责人&#xff1a;题干关键词 “优先级排序、与客户沟通、下次迭代做什么、接受或拒绝用户故事”。 2、Scrum Master&#xff1a;题…

AI测试入门:认识RAG(检索增强生成)

AI测试入门&#xff1a;认识RAG&#xff08;检索增强生成&#xff09; 前言1. RAG概述1.1 RAG的优势 2. RAG的工作原理2.1 信息检索2.2 上下文构建2.3 生成回答 3. RAG的应用场景4. 实现一个简单的RAG系统4.1 环境准备4.2 代码实现4.3 进一步优化 5. RAG的挑战与未来发展6. RAG…

[论文精读] StyleGAN2 论文代码理解 (上)

文章目录 一、前言二、简要介绍三、详细解析1、归一化的修改1.1生成器结构的修改1.2重新审视实例归一化(Instance normalization) 2、图像质量和生成器平滑(PPL相关内容)3、关于渐进式增长Progressive growing3.1采用替换结构(Alternative network)3.2不同分辨率的使用 4、图像…

未授权访问漏洞

一. Redis Redis 默认情况下&#xff0c;会绑定在 0.0.0.0:6379 &#xff0c;如果没有进⾏采⽤相关的策略&#xff0c;⽐如添加防 ⽕墙规则避免其他⾮信任来源 ip 访问等&#xff0c;这样将会将 Redis 服务暴露到公⽹上&#xff0c;如果在没有设 置密码认证&#xff08;⼀般为…

学习分享电商 API 接口接入指南:关键技术要点与实践

在当今数字化的商业环境中&#xff0c;电商 API 接口的接入对于企业拓展业务、提升运营效率以及优化用户体验具有重要意义。本文将详细探讨电商 API 接口接入的关键技术要点&#xff0c;并结合实践经验为您提供一份实用的接入指南。 一、电商 API 接口概述 电商 API 接口是电商…

【文献阅读】Accou2vec: A Social Bot Detection Model Based on Community Walk

Abstract Accou2vec。首先&#xff0c;为了切断人类账户和机器人账户之间的攻击边&#xff0c;利用类似深度自动编码器的非负矩阵分解社区检测算法将社交图划分为多个子图。然后设计了社区漫游规则&#xff0c;分别控制社区内部和社区间的漫游&#xff0c;同时考虑社区中的节点…

基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--添加商品功能

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 前文三篇登录和注册功能的实现 基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网&#xff08;1&#xff09;-项目搭建&#xff08;前期准备工作…

cjson

文章目录 概述编译cjson_test 小结 概述 在网络传输中&#xff0c;网络数据序列化&#xff0c;常用的有那么几种&#xff0c;json&#xff0c;protobuf都是很常用的&#xff0c;这一篇来写下json。 Json常用的有几个&#xff0c;rapidjson&#xff0c;jsoncpp&#xff0c;还有…

HarmonyOS开发:路由容器Navigation的使用详解

​目录 前言路由容器NavigationNavigation组成路由跳转操作Navigation下的页面生命周期最后 前言 众所周知&#xff0c;HarmonyOS作为华为推出的新一代操作系统&#xff0c;其开发框架提供了全新的能力和组件&#xff0c;以支持跨平台应用开发&#xff0c;越来越多的开发者加…

红黑树实现详解

实践意义 在各方面&#xff0c;红黑树要比AVL树性能更好&#xff0c;用途也更广泛 map&set底层都主要靠红黑树 概念 性质 插入时&#xff0c;抽象图 cur为新插入 插入时颜色更新逻辑图 板书

bugku-web-never_give_up

解题思路 F12查看请求和响应&#xff0c;查找线索 相关工具 base64解码URL解码Burp Suit抓包 页面源码提示 <!--1p.html--> 2. 去访问这个文件&#xff0c;发现直接跳转到BUGKU首页&#xff0c;有猫腻那就下载看看这个文件内容吧 爬虫下载这个文件 import requests …

20240804 每日AI必读资讯

25亿独角兽CEO带头跑路&#xff0c;携30员工卖身谷歌&#xff01;AI大佬&#xff1a;AGI泡沫几周就要破 - CEO一并带走的&#xff0c;还有Character.AI负责模型训练和语音AI的员工&#xff0c;也就是130名员工中的30人。他们将加入谷歌&#xff0c;参与Gemini AI项目。 - Cha…

【C++学习第19天】二分图

一、如何判断一个图是二分图&#xff1f; 二、代码 1、判断是否为二分图 #include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N 200010;int n, m; int h[N], e[N], ne[N], idx; int color[N];void add(int a, in…

JavaScript 继承百花齐放:从原型链到 ES6 类

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 在 JavaScript 中&#xff0c;继承是一个重要的知识点&#xff0c;上篇文章中我们已…

【Java】Java Swing 图书管借阅管理系统(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

python rsa如何安装

Python中的一些模块是用一个包管理器来发布的&#xff0c;RSA模块就是&#xff0c;所以首先需要安装setup tools工具。 1、下载文件&#xff1a;ez_setup.py 2、安装&#xff1a; sudo python ez_setup.py 3、下载RSA安装包&#xff1a;rsa-3.1.1-py2.7.egg 4、安装RSA&…

牛客JS题(二十一)数组扁平化

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; 递归flat字符串操作正则表达式替换 题干&#xff1a; 我的答案 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /></head><body><script&…

Dubbo源码深度解析(中)

接着《Dubbo源码深度解析(上)》继续讲&#xff0c;上篇博客主要讲Dubbo提供的三个注解的作用&#xff0c;即&#xff1a;EnableDubbo、DubboComponentScan、EnableDubboConfig。其中后两个注解是在EnableDubbo上的&#xff0c;因此在启动类上加上EnableDubbo注解&#xff0c;等…

数据分析模型:洞察数据背后的奥秘

数据分析模型&#xff1a;洞察数据背后的奥秘 事件分析模型通过对用户行为事件的深入剖析&#xff0c;能够了解用户在产品上的具体行为&#xff0c;为产品优化和营销策略提供了有力依据。漏斗分析模型则专注于用户转化流程&#xff0c;帮助找出业务流程中的薄弱环节&#xff0c…