TypeScript详解

文章目录

      • 一.TS 基础概念
        • 1.什么是TS
        • 2.TS基础类型与写法
        • * boolean string number array null undefined
        • * tuple - 元组
        • * enum - 枚举
        • * any unknown void
        • * object | Object | {} - 对象
      • 二. 接口 - interface
      • 三.交叉类型
      • 四.断言 - 类型声明,转换
      • 五.类型守卫 -Type Guards
      • 六.TS进阶
        • 1.泛型(Generics) - 重用
        • 2.装饰器 - decorator

一.TS 基础概念

1.什么是TS
  • 对比原理

  • ts是 js 的一个超集,在原有基础上添加了

  • 可选静态类型

  • 基于类的面向对象编程

  1. 编写项目 - 更利于架构维护
  2. 自主检测 - 编译期间检测
  3. 类型检测 - 支持了动态和静态类型检测;ts不是强类型语言=》本质上还是存在类型转换
  4. 运行流程 - 依赖编译
  5. 复杂特性 - 模块化,泛型,接口
2.TS基础类型与写法
* boolean string number array null undefined
// es
let isEnable = true;
let class = "ts";
let classNum = 2;
let classArr = ["basic","execute"];// ts
let isEnable:boolean = true;
let class:string = "ts";
let classNum:number = 2;
// 数组的两种写法
let classArr:string[]= ["basic","execute"];
let classArr:Array<string> = ["basic","execute"];
* tuple - 元组

数组的搭配比较多样,用来声明数组中有多种类型时使用

let tupleType:[string,boolean] tupleType =["ts",true]
* enum - 枚举
// 数字枚举- 默认从零开始,依次递增
enum Score {BAD,NG,GOOD,PERFECT
}
let score:Score = Score.BAD;// 字符串类型
enum Score {BAD="BAD",NG="NG",GOOD="GOOD",PERFECT="PERFECT"
}// 反响映射
enum Score {BAD,NG,GOOD,PERFECT
}
let scoreName = Score[0]; // "BAD",因为默认依次递增
let scoreValue = Score["BAD"];// 0// 异构 (数字和字符串都有)
// 字符串设置什么就是什么
// 数字类型依据上一个加一
enum Score {A, //0B, //1C='C',D="D",E=6,F // 7
}
* any unknown void
// 输入
//any - 绕过所有检查 => 类型检测和编译筛查全部失效
let anyValue:any =123;anyValue ="anyValue";// unknown - 绕过赋值检查=> 禁止更改传递
// 传递
let unkonwnValue:unknown;unknownValue="unknownValue";let value1:unknown =unknownValue;//ok
let value2:any=unknownValue;//ok
let value3:boolean = unknownValue;/nok// 返回
// void - 声明函数返回值 不返回任何值
function voidFunction():void{console.lg("no return")
}// nerver - 永不返回
function error(msg:string):never{throw new Error(msg)
}
function longlongloop():never{while(true)
}
* object | Object | {} - 对象
// object - 非原始类型
interface ObjectConstrutor {create(o:object | null):any;
}const proto = {};
Object.create(proto);//ok// Object  - 原型属性
// Object.prototype 上的属性
interface Object {constructor:Function;toString():string;valueOf():Object
}// {} - 空对象 - 没有成员的对象
const a = {} as A; // 通过断言来设置
a.class = "es"; 
a.name=30; // {} 表示空对象,赋值会抛出异常

二. 接口 - interface

在TypeScript中,接口是一种定义对象形状的方式,它描述了对象应该有哪些属性和方法,但并不直接提供这些属性和方法的实现。接口主要用于确保类或其他结构(如对象字面量)符合特定的契约

  1. 定义属性:接口可以定义对象的属性类型,但不包括属性值。
  2. 定义方法:接口可以定义对象的方法,但不包括方法的实现
  3. 只读属性:使用 readonly 关键字可以定义只读属性,即这些属性只能做对象被创建时被赋值,之后不能被修改
  4. 继承接口:一个接口可以继承另一个或者多个接口,从而继承它们的属性和方法
interface Class {name:string;time:number
}
let course:Class = {name:"ts",time:2
}//只读
interface Class {readonly name:string;time:number
}
// 任意
interface Class {name:string;time:number[propName:string]:any
}
// 面试题:ts 和 js的引用的不同
let arr:number[] = [1,2,3,4];
let ro:ReadonlyArray<number> = arr;ro[0] = 12; //Error - 只读状态不可赋值
ro.push(5); //Error - 增加
ro.length = 100; //Error - 长度改写arr = ro;//Error - 覆盖//定义方法
interface Greeter {greet(message: string): void;
}class PersonGreeter implements Greeter {greet(message: string) {console.log(`Hello, ${message}`);}
}//继承
interface Named {name:string;
}
interface Person extends Named{age:number
}const person:Person = {name:"张三"age:18
}

三.交叉类型

在TypeScript中,交叉类型是一种组合多个类型到一个单一类型的方式。通过交叉类型,你可以创建一个新的类型,这个类型具有所有被组合类型的特性。当一个对象具有多个类型的属性时通过&符号来定义的

  • 交叉类型和运算符里面的 与( && ) 是一样的,既要 … 又要 … 还要
  • 可以把两个对象合并到一个对象
// 合并
interface A {x:D}
interface B {x:E}
interface C {x:F}interface D {d:boolean}
interface E {e:string}
interface F {f:number}type ABC = A & B & C;let abc:ABC ={x:{d:false,e:"class",f:5}
}// 合并冲突
interface A {c:string;d:string
}
interface B {c:number;d:string
}
type AB = A & B;
// 合并关系是并且 => c:never

四.断言 - 类型声明,转换

在TypeScript中,断言是一种告诉编译器我们对某个表达式类型的明确预期的方式。通过使用断言,我们可以为编译器提供额外的信息,以确保在编译时能够正确地处理类型。断言不仅用于声明变量的类型,还可以用于在类型之间进行显式转换,从而确保代码的类型安全性。

// 尖括号
let anyValue:any = 'hi ts';
// 当anyValue是 string 时去取length
let anyLength:number = (<string>anyValue).length; //阶段性声明;// as 声明
let anyLength:number = (anyValue as string).length; //阶段性声明;// 非空判断 - 非空断言操作符 !
// 非空断言操作符,用于告知编译器我确定这个值是非空的,不需要再进行类型检查
type ClassTime = () => number;const start = (classTime:ClassTime | undefined)=>{let num = classTime!(); //确认一定不会为空
}

五.类型守卫 -Type Guards

在TypeScript中,类型守卫是一种特殊的表达式,它允许你执行运行时检查以缩小一个值的类型范围。类型守卫可以用于确保一个值是某种特定的类型,或者在多种类型之间进行区分。

typeof | instanceof 类型守卫

在TypeScript中,typeof 和 instanceof 运算符被特殊对待,并被认为是类型守卫。当它们用于类型检查时,TypeScript会缩小变量的类型范围。

interface Teacher {name:string;courses:string[];
}
interface Student{name:string;startTime:Date;
}type Class = Teacher | Studentfunction startCourse(cls:Class){if('courses' in cls){// teacher}if("startTime" in cls){// student}
}function startCourse(cls:Class){if(cls intanceof Teacher){// teacher}if(cls intanceof Student){// student}
}function startCourse(name:string,score:string | number){if(typeof score === "number"){// teacher}if(typeof score === "string"){// student}
}

六.TS进阶

1.泛型(Generics) - 重用

在 TypeScript 中,泛型是一种允许你为组件(如类、接口和函数)创建可复用的类型的方式,而无需在每次使用组件时都明确指定类型。泛型提供了一种创建可重用组件的方式,这些组件可以工作于多种数据类型。

  1. 泛型函数:泛型函数是指在调用指定类型参数的函数。在函数后面使用(其中 T 是类型变量)
  2. 泛型类:泛型类是在类定义中使用类型变量的类
  3. 泛型接口:中接口定义中引入类型变量
  4. 泛型约束:定义泛型时,可以对泛型参数添加一些约束,以确保它符合某些结构。可以通过中类型参数上设置extends 约束来实现
  5. 类型推断与默认类型:typeScript的类型推断机制可以自动推断泛型类型参数;泛型类型可以设置默认类型
//泛型函数
function startClass<T,U>(name:T,score:U):T{return name + score
}console.log(startClass(<stringnumber>('yy',5)))function startClass<T,U>(name:T,score:U):string{return `${name}${score}`
}function startClass<T,U>(name:T,score:U):T{return (name + String(score)) as any as T;
}// 泛型接口
interface GenericIdentityFn<T> {(arg: T): T;
}
function identityFn<T>(arg: T): T {return arg;
}
let myIdentity: GenericIdentityFn<number> = identityFn;// 泛型约束
interface Lengthwise {length: number;
}function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);  // 现在我们可以访问.length属性了return arg;
}// 使用泛型约束
loggingIdentity({length: 10, value: 3});
2.装饰器 - decorator

在 TypeScript 中,装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问符、属性或参数上。装饰器使用 @expression 的形式,其中 expression 必须在运行时求值为一个函数,它将在编译时调用,

装饰器可以使用在许多不同的上下文中,但它们的主要用途是修改类的行为,为类添加元数据,或者为类、方法、属性等提供额外的功能。

function Roo(target:Function):void{// 拿到的类target.prototype.startClass = function():void{// 逻辑}
}// 类装饰器
@@Roo
class Course {constructor(){// 业务逻辑}
}// 属性装饰器
function nameWrapper(target:any,key:string){// 逻辑处理Object.defineProerty(target,key){// 数据劫持}
}class Course {constructor(){// 业务逻辑}@nameWrapperpublic name:string
}

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

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

相关文章

springcloud 之 Ribbon Hystrix Feign bus 动态修改配置

Ribbon 是微服务架构图中负责负载均衡的 组件。 BeanLoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}测试如下&#xff1a; //微服务方式 Ribbon方式GetMapping("ribbon/{name}")public String RibbonTest(PathVariable String nam…

大模型所谓的参数是什么?大模型为什么需要训练?大模型训练到底干了什么?

“ 大模型的本质是机器学习&#xff0c;机器学习的本质就是一种数学模型。” 我们经常能听到这样的说法&#xff0c;某某大模型有多少参数&#xff0c;某某大模型参数量又提升了&#xff0c;这里所说的参数到底是什么&#xff1f; 我们知道大模型是训练出来的&#xff0c;那么…

中小学校活动怎样投稿给媒体报道宣传?

身为一名学校老师,同时承担起单位活动向媒体投稿的宣传重任,我深知每一次校园活动背后的故事,都承载着师生们的辛勤汗水与教育的无限可能。起初,我满怀着对教育的热情,希望通过文字传递校园的温暖与光芒,却在投稿的道路上遇到了前所未有的挑战。 最初,我选择了最传统的路径——…

如何理解Vue中的模板编译原理

Vue中的模板编译原理是一个将Vue模板转换为渲染函数的过程&#xff0c;它允许Vue在运行时动态生成虚拟DOM&#xff0c;从而实现高效的组件渲染。以下是对Vue模板编译原理的详细理解&#xff1a; 模板解析&#xff1a; Vue首先将模板字符串解析成一个抽象语法树&#xff08;AST&…

Elasticsearch集群内如何使用reindex迁移索引,完成分片的拆分

1、删除我的测试索引&#xff1a;old_index curl -X DELETE "http://hostname -i:9200/old_index" curl -X DELETE "http://hostname -i:9200/new_index"2、检查集群索引情况 $ curl -X GET "http://hostname -i:9200/_cat/indices?v" health…

【RSGIS数据资源】中国多时期土地利用遥感监测数据集(CNLUCC)

文章目录 数据基本信息摘要数据说明数据引用方式 数据基本信息 数据时间&#xff1a; 多时期(1970年代末期以来11期) 空间位置&#xff1a; 中国 数据格式&#xff1a; 矢量与栅格 空间分辨率&#xff1a; 30m 主题分类&#xff1a; 中国土地利用遥感监测数据 DOI标识&#xf…

c语言之文件格式化写入

向文件写入特定的信息&#xff0c;在c语言中需要fprintf语句 fprintf语句的格式是 fprintf(文件指针&#xff0c;格式字符串&#xff0c;输出表列&#xff09; 示例代码如下 #include<stdio.h>int main() {FILE *fp;int a123;float b3.1415f;fpfopen("eee.txt&q…

TS中的InstanceType函数和Typeof 操作符

InstanceType函数 简介 instancetype函数&#xff1a;该函数返回&#xff08;构造&#xff09; 由某个构造函数构造出来的实例类型组成的类型。 常见使用 场景一 【vue中的instanceType用法】父组件用ref获取子组件时&#xff0c;通过 instanceType获取子组件的类型 <!-- …

UNION的使用

UNION的使用 给出将多条查询语句组合成单个结果集&#xff0c;两个表对应的列数和数据类型必须相同 UNION操作符&#xff1a; 返回两个查询结果集的并集&#xff0c;并去除重复记录 UNION ALL操作符 返回两个查询的结果集的并集。不去掉两个结果集的重复部分&#xff0c;重…

存储方式 - 前端学习

1. cookie是什么&#xff1f;你了解cookie吗&#xff1f; 在计算机领域中&#xff0c;特指一种由服务器发送到用户浏览器并保存在用户计算机上的小型文本文件。这个文件可以被服务器用来识别用户身份、跟踪用户活动、保存用户设置等。它通常由名称、值、域名、路径、过期时间等…

【漏洞复现】号卡极团分销管理系统 ue_serve.php 任意文件上传漏洞

0x01 产品简介 号卡极团分销 管理系统&#xff0c;同步对接多平台&#xff0c;同步订单信息&#xff0c;支持敢探号一键上架&#xff0c;首页多套U|商品下单页多套模板&#xff0c;订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定&#xff0c;内置敢探号、172平台…

CLIP源码详解:clip.py 文件

前言 这是关于 CLIP 源码中的 clip.py 文件中的代码带注释版本。 clip.py 文件的作用&#xff1a;封装了 clip 项目的相关 API&#xff0c;通过这些 API &#xff0c;我们可以轻松使用 CLIP 项目预训练好的模型进行自己项目的应用。 另外不太容易懂的地方都使用了二级标题强…

【机器学习300问】101、1x1卷积有什么作用?

卷积神经网络最重要的操作就是卷积层的卷积操作&#xff0c;之前文章中介绍过&#xff0c;卷积核filter往往都是3x3或者5x5什么的&#xff0c;但有一种非常特殊的卷积——1x1卷积。他在CNN中扮演着非常重要的角色。 一、通道维度的降维/升维 这是1x1卷积最显著的作用之一。通过…

【记录贴】docker镜像格式报错

1&#xff0c;错误内容 最近想要补一补docker的基础知识&#xff0c;跟着练习的时候&#xff0c;发现下面的错误。 换了其他镜像&#xff08;docker pull ubantu&#xff09;也存在同样的问题&#xff1a; 错误内容&#xff1a;docker: mediaType in manifest should be appli…

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型

AIGC 008-IP-Adapter文本兼容图像提示适配器用于文本到图像扩散模型&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文介绍了 IP-Adapter&#xff0c;一种 高效地将预训练的图像到图像转换模型适应到新领域 的方法。它通过在预训练模型的 输入端 添加一个…

如果任务过多,队列积压怎么处理?

如果任务过多,队列积压怎么处理? 1、内存队列满了应该怎么办2、问题要治本——发短信导致吞吐量降低的问题不能忽略!!3、多路复用IO模型的核心组件简介1、内存队列满了应该怎么办 如图: 大家可以看到,虽然现在发短信和广告投递,彼此之间的执行效率不受彼此影响,但是请…

【ES001】elasticsearch实战经验总结(最近更新中)

1.熟悉、梳理、总结下elasticsearch相关知识体系。 2.日常研发过程中使用较少&#xff0c;随着时间的推移&#xff0c;很快就忘得一干二净&#xff0c;所以梳理总结下&#xff0c;以备日常使用参考 3.欢迎批评指正&#xff0c;跪谢一键三连&#xff01; 文章目录 1. 1.

SpringBoot 上传文件示例

示例效果&#xff1a; 前端代码&#xff1a; <html> <head><title>上传文件示例</title></head> <body> <h2>方式一&#xff1a;普通表单上传</h2> <form action"/admin/upload" method"post" enctyp…

【Android14 ShellTransitions】(五)启动Transition

这一节的内容涉及WMCore以及WMShell&#xff0c;主要是启动Transition。 回到ActivityStarter.startActivityUnchecked方法&#xff1a; 看下最后启动Transition的部分&#xff0c;在ActivityStarter.handleStartResult中&#xff1a; 只关注我们要关注的部分。 首先是如果这…

网络原理-HTTP协议

HTTP协议 HTTP协议全称为超文本传输协议,除了能传输字符串,还能传输图片、视频、音频等。 当我们在访问网页的时候,浏览器会从服务器上下载数据,这些数据都会放在HTTP响应中,然后浏览器再根据这个HTTP响应显示出网页信息。 抓包 抓包工具本质上是一个代理工具,即我们将构造…