TypeScript(二):TypeScript的细节

TypeScript语法细节

联合类型(满足其中一个即可)

  • 可以使用多种运算符,从现有的类型中构建新类型
    • const number|string = 123
  • 可以是这些类型中的任何值
  • 但是使用的时候需要小心
let virable: number | string = 123function getData(id: number | string) {//若我们想使用length方法,需要使用类型缩小//直接使用会报错// console.log(id.length)if (typeof id === "string") {console.log(id.length)} else {console.log(id);}
}

类型别名

  • TypeScript中我们可以给类型起别名
  • 主要是方便代码的阅读以及联合类型的复用
type IDtype = number | stringfunction getData(id:IDtype) {//若我们想使用length方法,需要使用类型缩小//直接使用会报错// console.log(id.length)if (typeof id === "string") {console.log(id.length)} else {console.log(id);}
}

接口声明

  • TypeScript中可以使用interface,对对象类型进行取别名
//采用声明式命名
interface IPerson {name: string,age:number
}
  • 在大部分情况下,type与interface是没有区别的,实现的功能是一样的

type与interface的区别

  • 一是type可以对应多种类型,而interface只能针对于对象类型
  • 二是type不能对同一别名重复声明,而interface可以
    • interface重复声明一个别名,可以将其进行合并
  • 三是interface具有继承性,方便了代码后期的拓展
// * 一是type可以对应多种类型,而interface只能针对于对象类型
type numberType = number
type ObjType = { x: string }
interface IObj { x: string }// * 二是type不能对同一别名重复声明,而interface可以
//   * interface重复声明一个别名,可以将其进行合并
interface IObj { y: number }//需要满足x以及y// * 三是interface具有继承性,方便了代码后期的拓展
interface IObjZ extends IObj {//需要满足x以及yz:boolean
}
  • 总结,在实际开发中,对象类型使用interface,其他类型使用type即可

交叉类型(多种类型要同时满足)

  • 通常是针对于对象类型进行的
  • 若是普通类型的使用交叉类型,则会自动推断出是never类型
type myType = number & string
//通常不会这样操作
  • 现在有两个对象类型,需要同时满足
interface IObj1 {name: stringage:number
}interface IObj2{walk:()=>void
}type IObj1IObj2 = IObj1&IObj2
//类型注解的时候可以使用IObj1IObj2,与下面的代码一致
const myObj: IObj1 & IObj2 = {name: "zhangcheng",age: 18,walk() {console.log("walk");}
}

类型断言as

  • 通常用在获取元素节点的时候

  • 获取元素节点的时候,若根据标签获取 TS会根据标签推断出生成的是什么类型,可以做后续操作

  • 但是若使用 id或者class进行获取,则不会推断出是什么类型,后续的操作也不能正常进行

const imEle = document.querySelector("div")
//可以直接进行对应类型的操作

image.png

const imEle = document.querySelector(".myDiv")
//可以进行指定
const imEle = document.querySelector(".myDiv") as HTMLDivElement

image.png

image.png

  • 对于普通类型的也可以进行类型断言
    • 一般是由确定的类型转成不太确定的类型
    • 或者由宽泛的类型,转成确定的类型
    • 注意不能对类型强制类型转换
let str: string = "123" as anylet myAny:any = 123 as number

非空类型断言

  • 对标识符后面加!进行非空类型断言
  • 在上述的学习中,我们知道,有些标识符是可有可无的
  • 对于可有可无的标识符,我们在确保一定存在的情况下,就可以使用非空类型断言
function foo(message?: string) {//直接使用会报错,因为message有可能没有// console.log(message.length);//解决方案一,使用可选链console.log(message?.length)//解决方案二:非空类型断言,在message一定存在的情况下console.log(message!.length)
}

字面量类型

  • 当我们使用const声明一个变量的时候,会用后面的值当作一个类型,即为 字面量类型

image.png

  • 但是单纯的这样写字面量类型,是没有意义的
  • 通常用于 类似于枚举的用途
type requestType = "GET" | "POST"function request(url: string, method: requestType) {//这样method只能取GET或者POST
}request("http://xxx","GET")
  • 但是若是以下情况,则不能直接传值
    • 我们将要传入的信息用对象包裹
type requestType = "GET" | "POST"function request(url: string, method: requestType) {//这样method只能取GET或者POST
}let info = {url: "http://xxxx",method:"GET"
}
//这样直接传会报错,因为info.method是string类型,而函数参数是requestType类型
// request(info.url,info.method)//解决方案一
//使用类型断言
request(info.url, info.method as "GET")//解决方案二
//使用字面量推理
let info2 = {url: "http://xxxx",//url的类型"http://xxxx"method:"GET"//method的类型"GET"
} as constrequest(info2.url,info2.method)

类型缩小

  • 目的是让一个类型,缩小到一个更加准确的范围
  • 而与类型缩小一同使用的就是 类型保护
  • 类型保护的方法通常有以下方法
    • typeof
    • === !==
    • instanceof
    • in
//typeof
type messageType = string | number
function getDataId(id: messageType) {//id有可能是string类型或者,number类型if (typeof id === "string") {//判断条件就是类型保护,只有在string类型状态下,才会做如下操作console.log(id.split(" "))}
}//===/!==通常用在判断字面量类型上
type requestType = "GET" | "POST"function request(method: requestType) {//method有可能是GET或者POSTif (method === "GET") {//当method为GET的时候,执行的操作} else {}
}//instanceof
function formate(date: string | Date) {//时间的格式化,用于可能传入string或者Date对象if (date instanceof Date) {//判断date是否是Date实例出来的}
}//in,通常用于判断传入的对象中有没有某个属性
type userInfoType = {name:string,age:number}
let userInfo:userInfoType = { name: "zhangcheng", age: 18 }
function changeUserInfo(userInfo:userInfoType) {//判断userInfo中是否有name属性if ("name" in userInfo) {console.log(userInfo.name);}
}

TypeScript函数的类型

  • TypeScript中,函数参数有类型,函数的返回值有类型
  • 而函数本身也有类型
  • 通过函数类型表达式进行声明
//type fnType = (参数:参数类型)=>返回值类型
type fnType = (num1: number,num2:number) => number//在一个函数中传入另外一个函数
//对这个函数进行类型指定
function numberSum(fn: fnType) {console.log(fn(10,20)) 
}numberSum(function (num,num1) {return num+num1
})
  • 通过函数调用签名的方式进行声明
    • 因为函数本身是一个对象
    • 若想将函数作为一个对象,且使用其中的属性,就可以使用调用签名的方法
interface Ifn {name: stringage: number//以下就是函数调用签名,代表这个对象可以被调用(num1:number,num2:number):number
}function calc(fn: Ifn) {console.log(fn.name,fn.age);fn(10,20)
}function sum(num1:number,num2:number) {return num1+num2
}
sum.name = "123"
sum.age = 18calc(sum)
  • 构造签名
    • 是指函数可以通过 new方法进行调用
class Person{}interface ICONPerson {//构造签名new () : Person
}function factory(fn: ICONPerson) {return new fn()
}

参数的可选类型

  • 在函数的参数中,有些参数是可以传可以不传的,那么我们可以将这个参数设置为可选参数
  • 参数设置为可选参数,其类型就是 指定的类型 | undefined的联合类型
  • 其中y就是可选类型
  • 一般可选类型都是设置在最后
function sum(x:number,y?:number){}

参数的默认值

  • 我们可以给函数的参数设置默认值
  • 设置默认值的参数,在实际调用中,可以不用传参
  • 设置默认值的参数,可以不用标明类型注解
  • 同时该参数可以接收 undefined
function sum(x:number,y=100){}

剩余参数

  • 我们可以使用…的方式接收传递进来的剩余参数
function sum(...arr: (string | number)[]) {console.log(arr);
}

函数的重载(了解)

  • 现在有一个需求
    • 有一个sum函数,接收两个参数
    • 这两个参数可能是number类型或者string类型
    • 返回两个参数相加的值
  • 注意:联合类型是不能使用+运算符的
//函数重载
function sum(num1: number, num2: number)
function sum(num1:string,num2:string)//通用函数,是不能直接被调用的
function sum(num1, num2) {return num1+num2
}console.log(sum(10, 20));
console.log(sum("10", "20"));
//会报错
// console.log(sum(10,"20"));

可推导的this类型

  • 目前在vue3以及react的项目中,其实很少再用到this了
  • 但是我们还是应该了解以下this的类型
  • 在没有特殊配置的情况下,TS中的this类型就是any类型
let obj = {name: "zhangcheng",sport() {console.log(this);}
}function sum() {console.log(this);
}
  • 我们可以通过 tsc --init初始化TS的配置,会生成一个 tsconfig.json的文件

  • noImplicitThis配置项为true,将不会允许模糊的this出现

    • 但是this会通过上下文进行推导,推导成功的则正常使用(对象obj中的this
    • 没有推导成功的,则编译不通过(sum函数中的this
  • 同时,我们可以给 sum函数指定this

//第一个参数为指定this类型的参数,这是固定位置,且名称不能变
//后续的参数才是参数
function sum(this:{name:string},arg:number) {console.log(this);
}//只能通过call,bind,apply调用
sum.call({name:"zhangcheng"},10)

this相关的内置工具

  • ThisParameterType和OmitThisParameter
function sum(this: { name: string }, num: number) { }//提取函数中的this类型
type sumThis = ThisParameterType<typeof sum>//剔除this,其余参数的类型
type argType = OmitThisParameter<typeof sum>
  • ThisType工具,主要是将上下文的this绑定到某一个类型身上
    • pinia内部实际上用了这个方法,这只是一个简易版本,运行将会是undefined
interface IState{stateName:string
}interface IStore {state: IStategetData:()=>void
}//这里的this类型,将会是IState类型
let store: IStore & ThisType<IState> = {state: { stateName: "lisi" },getData() {//因此可以直接通过this.stateName访问state中的变量console.log(this.stateName);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洗地机买什么牌子的好?性价比高的洗地机品牌

现在&#xff0c;洗地机已成为日常地面清洁的新宠&#xff0c;备受消费者青睐。其受欢迎程度不仅在于它巧妙地融合了吸尘、拖地、洗刷、除菌等多项高效清洁功能&#xff0c;还能自动完成清洁过程并确保自身清洁卫生&#xff0c;从而为我们带来了更为便捷的清洁体验&#xff0c;…

2024 ,Android 15 预览版来了

日前&#xff0c;Android 15 发布了 Preview 1 预览版&#xff0c;预览计划将从 2024 年 2 月持续到 Android 15 公开发布&#xff08;预计 10 月&#xff09;&#xff0c;3月是开发者预览版 2&#xff0c;4 月将推出 Beta 1&#xff0c;5 月将推出 Beta 2&#xff0c;6 月的 B…

Linux系统——http协议介绍

目录 引言——Internet起源 一、http协议——超文本传输协议 1.http相关概念 2.访问浏览器的过程 3.http协议通信过程 4.http相关技术 4.1WEB开发语言 4.2html 4.3CSS 4.4JS 5.MIME——Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 6.URI URN URL的…

shell脚本文本三剑客grep,sed,awk

1. 正则表达式&#xff0c;又称正规表达式、常规表达式 使用字符串来描述、匹配一系列符合某个规则的字符串 正则表达式组成&#xff1a; 普通字符包括大小写字母、数字、标点符号及一些其他符号。 元字符是指在正则表达式中具有特殊意义的专用字符 man 7 regex 可以使用man手…

技术选型指南:Oracle、SQL Server还是DB2?

Oracle vs SQL Server vs DB2 - 选哪个好&#xff1f; 在企业级数据管理领域&#xff0c;常用的几个选择有Oracle、SQL Server和DB2。 首先&#xff0c;我们从以下几个方面做一下对比&#xff1a; 1. 性能和稳定性&#xff1a; Oracle: Oracle就像是那种精密的瑞士手表&…

[ai笔记10] 关于sora火爆的反思

欢迎来到文思源想的ai空间&#xff0c;这是技术老兵重学ai以及成长思考的第10篇分享&#xff01; 最近sora还持续在技术圈、博客、抖音发酵&#xff0c;许多人都在纷纷发表对它的看法&#xff0c;这是一个既让人惊喜也感到焦虑的事件。openai从2023年开始&#xff0c;每隔几个…

美容小程序:让预约更简单,服务更贴心

在当今繁忙的生活节奏中&#xff0c;美容预约常常令人感到繁琐和疲惫。为了解决这个问题&#xff0c;许多美容院和SPA中心已经开始采用美容小程序来简化预约流程&#xff0c;并提供更加贴心的服务。在这篇文章中&#xff0c;我们将引导您了解如何制作一个美容小程序&#xff0c…

【网络安全 | 网络协议】一文讲清HTTP协议

HTTP概念简述 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;协议&#xff0c;又称超文本传输协议&#xff0c;用于传输文本、图像、音频、视频以及其他多媒体文件。它是Web应用程序通信的基础&#xff0c;通过HTTP协议&#xff0c;Web浏览器可以向Web服务器发起请…

C++ STL详解:map

目录 一、map的使用 1.1map模板参数 1.2map的构造函数及迭代器 1.3map的容量与元素访问 1.4map中的增删查改 二、日常实操 一、map的使用 CSTL详解&#xff1a;set 通过对set的简单了解&#xff0c;我们可以知道&#xff0c;set就类似于二叉搜索树的key模型&#xff0c;…

openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优

文章目录 openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优223.1 逻辑内存管理参数223.2 执行算子是否下盘的参数 openGauss学习笔记-223 openGauss性能调优-系统调优-数据库系统参数调优-数据库内存参数调优 数据库的复杂查询语句性…

1.3_3 系统调用

1.3_3 系统调用 &#xff08;一&#xff09;什么是系统调用 回顾&#xff1a;操作系统作为用户和计算机硬件之间的接口&#xff0c;需要向上提供一些简单易用的服务。主要包括命令接口和程序接口。其中&#xff0c;程序接口由一组系统调用组成。 “系统调用”是操作系统提供给…

leetcode(动态规划)53.最大子数组和(C++详细解释)DAY12

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 提示 2.解答思…