TypeScript常用知识点整理

news2024/11/27 6:43:16

介绍

TypeScript 是 JavaScript 的一个超集,添加了静态类型支持和更多现代编程特性,提高了代码的可靠性和可维护性。最终会被编译成标准的 JavaScript 代码运行。

使用npm install -g typescript进行全局安装

将编写好的ts代码进行运行,第一种是手动运行直接输入对应的命令tsc加对应的ts文件,另一种是使用vscode tsc --init自动运行

基础

1,原始数据类型

JavaScript的类型分为两种:原始数据类型(Primitive data types)和对象类型(Objecttypes)。
原始数据类型包括:布尔值、数值、字符串、null 、 undefined以及ES6中的新类型 symbol等。

一,布尔类型,字符串,数字类型,undefined和null在ts中的使用

export{}
//布尔类型
let flag:boolean=true
console.log(flag)
//数字类型
let num:number=20
console.log(num)
//字符串类型
let str1:string='李四'
str1='张三'
console.log(str1)

//undefined和null
let unf:undefined=undefined
let nu:null=null
console.log(unf,nu)



编译完成转成js之后的代码

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//布尔类型
let flag = true;
console.log(flag);
//数字类型
let num = 20;
console.log(num);
//字符串类型
let str1 = '李四';
str1 = '张三';
console.log(str1);
//undefined和null
let unf = undefined;
let nu = null;
console.log(unf, nu);

2,数组

在ts中进行数组的定义

export{}
//定义数组和前两种基本数据类型有所不同
//方式一
let arr1:number[]=[1,2,3]
console.log(arr1)
//方式二使用泛型
let arr2:Array<number>=[4,5,6]
console.log(arr2)

被转成js之后

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//定义数组和前两种基本数据类型有所不同
//方式一
let arr1 = [1, 2, 3];
console.log(arr1);
//方式二使用泛型
let arr2 = [4, 5, 6];
console.log(arr2);

3,对象

表示非原始类型,除了number,string,boolean之外的类型

export{}
let obj:object={}
let obj2:object={a:1}
obj = new String()
obj=obj2
console.log(obj)

被编译js之后

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
let obj = {};
let obj2 = { a: 1 };
obj = new String();
obj = obj2;
console.log(obj);

4,any类型

在typescript中,任何类型的值都可以赋值给 any , any 也可以赋值给任意类型

export{}

let type1:any=true
type1=222
console.log(type1)

let newArr:any[]=[1,2,3,4]
console.log(newArr)

被转换成ts之后和最终的输出结果

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
let type1 = true;
type1 = 222;
console.log(type1);
let newArr = [1, 2, 3, 4];
console.log(newArr);

5,void类型

它表示空值,代表没有任何返回值的函数

export{}
function fun1():void{
    console.log(123)
}
console.log(fun1())

转换成ts之后及输出

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function fun1() {
    console.log(123);
}
console.log(fun1());

6,类型推断

ts在没有明确指定类型的时候会推测一个类型,分两种情况

1,定义变量的时候,直接给变量赋值,则定义类型为对应的类型

2,定义变量的时候,没有赋值,则定义类型为any类型

export{}

let t1=123//这里t1是number类型,如果给t1一个字符串则会有错误提示
let g2;//这里的g2可以是任意类型的,相当于any
g2=123
g2=''
g2=[]

7,联合类型

表示取值可以为多种类型中的一种

export{}
//定义布尔类型和number类型的
let f:boolean|number=true//表示这个值可以接受布尔值和number两种的任意一种
f=123
f=false
console.log(f)

8,接口-对象类型

什么是接口?

1,在面向对象语言中,接口(Interfaces)是一个概念,它是对行为的抽象,而具体如何行动需要由类(classes)去实现( implement);
2,TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述;

3,接口它是对行为的抽像,用于行为的描述,理解为一种约束; 

4,定义中的属性和类型必须要和使用的相同; 
 

interface Person{
    name:string,
    age:number,
    height?:number,//加了问了表示是一个可选属性,这个属性可以有,也可以没有
    readonly add:string,//定义一个只读的,对其行为进行一个约束
}
let P:Person={
    name:"李四",
    age:18,
    height:24,
    add:"某某区"
}
//如果在对id进行操作,则会给出错误提示
P.id='某某区1'//这里会错误提示

9,接口-数组类型

接口对数组进行约束

interface InewArray{
    [index:number]:number//表示接口里面有任意值,并且只能是number类型
}
//进行定义
let arr:InewArray=[1,2,3,4]//如果这里面传入非number类型,会有错误提示
console.log(arr)//1,2,3,4

10,接口-函数类型

对函数进行约束

//定义了一个add函数,a和b都是number类型
//后面的number表示这个函数的返回为number类型
function add(a:number,b:number): number{
    return a+b
}
console.log(add(1,2))
//另一种定义函数的方式
//这里的问号也是代表可选参数,必选参数不可以放在可选参数的后面
let res=function(a:string,b?:string):string{
    return a+b
}
console.log(res('type','script'))
//多个参数的情况
function fn(x:string,y:string,...args:number[]){
    console.log(x,y,args)
}
fn('','',1,2,3)
//多个函数类型
function add2(x:string|number,y:string|number):string|number{
    if(typeof x=='string'&&typeof y=='string'){
        return x+y
    }else if(typeof x=='number'&&typeof y=='number'){
        return x+y
    }
}
add2(2,3)
add2('张三','李四')

11,类型断言

将一个联合类型断言为其中一个类型

//定义一个函数,获取到一个数字或字符串的长度
//类型断言,可以手动指定一个类型,两种方式
//1,变量 as 类型
//2,<类型> 变量
function StringLength(x:string|number):number{
    if((x as string).length){
        return (<string>x).length
    }else{
        return x.toString().length
    }
}
console.log(StringLength('typescript'))
console.log(StringLength(123))

将任何一个类型断言为any

进阶

1,类型别名

类型别名用来给一个类型起个新名字

type s=string//给类型起别名
let str:s='typescript'
console.log(str)
//另一种使用方式
type all=string|number|boolean
let a1:all=123
console.log(a1)

2,字符串字面量类型

字符串字面量类型用来约束取值只能是某几个字符串中的一个

//例如指定只能取以下的几个值
type stringName='张李'|'李四'|'王五'
//这里的name只能取上面三个中的一个
let name:stringName="李四"
console.log(name)

3,元组

数组合并了相同类型的对象,而元组合并了不同类型的对象

//定义一个元组
let Arr:[number,string]=[123,'Script']
//添加内容的时候,需要的是number和string类型即可
Arr.push(456)
Arr.push('hhh')
//如果添加的数据越界会给出错误提示

4,枚举

枚举(Enum)类型用于取值被限定在一定范围内的,比如一周只能有七天,颜色限定为红
绿蓝等。

1,常数项

枚举的使用

enum NumberType{
    one=1,
    two=2,
    three,
    four
}
console.log(NumberType)

注意点:

    1,每个数据值都可以是元素
    2,如果没有手动赋值,默认第一个参数为0,后面的递增加1
    3,后面的值如果没有手动赋值,会根据前面的值递

编译成js之后

(function (NumberType) {
    NumberType[NumberType["one"] = 1] = "one";
    NumberType[NumberType["two"] = 2] = "two";
    NumberType[NumberType["three"] = 3] = "three";
    NumberType[NumberType["four"] = 4] = "four";
})(NumberType || (NumberType = {}));
console.log(NumberType);
2,计算所得项
//计算所得项
enum abs{
    red,
    //这里写了计算所得项,需要放置在已经确定的赋值枚举项之前
    blur='blur'.length
}

5,类

1,在类中定义属性和方法
//ts中的类
class Person {
    //对被传入的属性进行类型限定
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    say(str) {
        console.log("haha", str);
    }
}
let Obj = new Person("张三", 28);
Obj.say("王五");

编译成js之后

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    say(str) {
        console.log("haha", str);
    }
}
let Obj = new Person("张三", 28);
Obj.say("王五");
//编译成ts后输出  haha 王五
2,使用类进行继承
//使用类进行继承  父类
class Dog{
    name:string
    age:number
    constructor(name:string,age:number){
        this.name=name
        this.age=age
    }
    say(str:string){
        console.log("ha",str)
    }
}
//子类
class cat extends Dog{
    constructor(name:string,age:number){
        //调用父类的构造函数,使用super
        super(name,age)
    }
    jump(str:string){
        console.log("jump",str)
    }
}

let cat1=new Dog("旺财",4)
console.log(cat1.say("来财"))
let cat2=new cat("花猫",3)
console.log(cat2.jump("小多多"))

被编译之后的js代码

class Dog {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    say(str) {
        console.log("ha", str);
    }
}
//子类
class cat extends Dog {
    constructor(name, age) {
        //调用父类的构造函数,使用super
        super(name, age);
    }
    jump(str) {
        console.log("jump", str);
    }
}
let cat1 = new Dog("旺财", 4);
console.log(cat1.say("来财"));
let cat2 = new cat("花猫", 3);
console.log(cat2.jump("小多多"));
3,修饰符public,private 和 protected

TypeScript 可以使用三种访问修饰符(Access Modifiers),分别是 public(公共) 、private(私有的)  和protected(受保护的)
1,public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都
是 public
2,private修饰的属性或方法是私有的,不能在声明它的类的外部访问
3,protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许
被访问的

4,接口继承类
class newDog{
    name:string
    age:number
    constructor(name:string,age:number){
        this.name=name
        this.age=age
    }
    say(str:string){
        console.log("ha",str)
    }
}
//接口只会继承类中的实例属性和方法
interface newCat extends newDog{
    age:number
}
let person:newCat={
    name:"",
    age:18,
    say(){

    }
}
console.log(person)

6,类与接口的联合使用

一般来讲,一个类只能继承自另一个类,有时候不同类之间可以有一些共有的特性,这时候就可以把特性提取成接口(interfaces),用implements关键字来实现。这个特性大大提高了面向对象的灵活性。

interface Ising{
    sing()
}
interface Sdance{
    dance()
}
class obj1 implements Ising{
    sing(){

    }
}
class obj2 implements Sdance{
    dance(){
        
    }
}

const o1=new obj1()
const o2=new obj2()
o1.sing()
o2.dance()

7,接口的合并

如果定义了两个相同名字的函数,接口或类,那么它们会合并成一个类型

//合并的数据要一模一样,有一处不同会有错误提示
interface Dog{
    name:"来财"
}
interface Dog{
    name:"来财",
    age:15
}

const cat:Dog={name:"来财",age:15}
console.log(cat)

8,泛型

泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
1,具体使用

/*
1,定义一个函数,传入两个参数,第一个参数是数据,第二个参数是数量
2,函数的作用:根据数量产生对应个数的数据,存放在一个数组中
*/
//这里的T表示可以输入任何类型
//如果没有确定会自动进行类型推断
function newGetArr<T>(value:T,count:number):T[]{
    let arr:T[]=[]
    for(let i=0;i<count;i++){
        arr.push(value)
    }
    return arr
}
console.log(newGetArr(123,3))

2,对数据互换位置

function updataStr<T,U>(t:[T,U]):[U,T]{
    return [t[1],t[0]]
}
console.log(updataStr(['456',123]))

3,泛型约束

在函数内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性
或方法。

//获取参数的长度,约束这个任意输入的类型,必须有length属性
interface Llength{
    length:number
}
//通过接口约束类型
function getLength<T extends Llength>(x:T):number{
    return x.length
}
console.log(getLength('123'))

4,泛型接口和泛型类

//泛型接口
interface IArr{
    <T>(value:T,count:number):Array<T>
}
let newGetArr2:IArr=function<T>(value:T,count:number):T[]{
    let arr:T[]=[]
    for(let i=0;i<count;i++){
        arr.push(value)
    }
    return arr
}
console.log(newGetArr2(123,3))
//泛型类
class Person1<T>{
    name:string
    age:T
    constructor(name:string,age:T){
        this.name=name
        this.age=age
    }
}
const p1 = new Person1<String>("ts","123")
const p2 = new Person1<number>("456",20)
console.log(p1,p2)

typeSscript使用感受:

        1,有一定的学习成本,感觉和学一门新语言差不多;

        2,和直接使用javascript写代码相比,typescript需要编写更多的代码无形之中增加了工作量;

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

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

相关文章

从零开始搭建后端信息管理系统(新手小白比如)

如果你是新手小白&#xff0c;首先我们要进行一些准备工作&#xff0c;安装一些基础软件&#xff0c; 备注一下&#xff1a;这里安装的vue环境的后台管理系统&#xff0c;不同的后台管理系统&#xff0c;需要安装不同的插件 准备工作&#xff1a; 安装 Visual Studio Code …

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS二次开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 定义 特点 使用场景 优缺点 (1) 优点…

【JavaWeb】Day34.MySQL概述——数据库设计-DDL(一)

项目开发流程 需求文档&#xff1a; 在我们开发一个项目或者项目当中的某个模块之前&#xff0c;会先会拿到产品经理给我们提供的页面原型及需求文档。 设计&#xff1a; 拿到产品原型和需求文档之后&#xff0c;我们首先要做的不是编码&#xff0c;而是要先进行项目的设计&am…

服务器测试之intel E8102CQDA2

这个卡是个双口100G双芯片的卡&#xff0c;QSFP28 单口速率100G&#xff0c;双口200G 1.BIOS下pcie带宽设置 服务器BIOS下支持设置PCIE link width 设置x8x8&#xff0c;否则只能显示一个网口&#xff0c;如下图 E810-2CQDA2需要BIOS下设置该卡槽位pcie slot link width 设置x8…

基于YOLOv8的摄像头下铁路工人安全作业检测系统

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文摘要&#xff1a;基于YOLOv8的铁路工人安全作业检测系统&#xff0c;属于小目标检测范畴&#xff0c;并阐述了整个数据制作和训练可视化过程&#xff0c; 博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff0…

分享Fork/Join经典案例

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 在上一篇的文章java 多线程分治求和&#xff0c;太牛了的文章中&#xff0c;提到…

【JVM】常见的JVM参数

常见的JVM参数 ◼ 参数1 &#xff1a; -Xmx 和 –Xms-Xmx 参数设置的是最大堆内存&#xff0c;但是由于程序是运行在服务器或者容器上&#xff0c;计算可用内存时&#xff0c;要将元空间、操作系统、 其它软件占用的内存排除掉。 案例&#xff1a; 服务器内存4G&#xff0c;…

【Leetcode每日一题】 递归 - 二叉树剪枝(难度⭐⭐)(50)

1. 题目解析 题目链接&#xff1a;814. 二叉树剪枝 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 想象一下&#xff0c;你有一堆层层叠叠的积木&#xff0c;你想从底部开始&#xff0c;把那些标记为0的积木拿走。如…

如何在Flutter应用中配置ipa Guard进行混淆

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

【行业资讯】AI算力的需求推动光模块行业快速迭代

近期&#xff0c;由OpenAI发布的人工智能文生视频大模型Sora再次引起了不小的轰动&#xff0c;继ChatGPT之后&#xff0c;Sora的推出让AIGC&#xff08;生成式人工智能&#xff09;再度成为行业焦点&#xff0c;AI大模型的快速迭代升级对网络架构提出了更高要求&#xff0c;推动…

GlusterFS分布式存储

目录 前言 一、GlusterFS分布式存储概述 1、GFS概念 2、GFS特点 3、GFS术语 4、GFS构成 5、GFS工作流程 6、后端存储如何定位文件 7、GlusterFs的卷类型 7.1 Distributed Volume&#xff08;分布式卷&#xff09; 7.2 Striped Volume&#xff08;条带卷&#xff09…

项目实战 | 使用python分析Excel销售数据(用groupby)

项目实战 | 使用python分析Excel销售数据 本文目录&#xff1a; 零、00时光宝盒 一、提出问题 二、理解数据 2.1、安装python读取excel文件的库 2.2、查看excel表的字段名和前几行记录 2.3、查看excel表结构 2.4、查看索引 2.5、查看每一列的列表头内容 2.6、查看每一…

SpringBoot中application.yml引入多个YML文件

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 首先,你要了解SpringBoot配置文件加载顺序,加载位置(代码内,Nacos等)…

[数据结构]栈和队列结构的简单制作

一、栈 1.1栈的概念以及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原…

yolov7的改进工地安全帽佩戴检测系统-协同双注意力机制CDAM2(教程+代码)

研究的背景和意义 随着工业化和城市化的快速发展&#xff0c;建筑工地的安全问题日益凸显。在建筑工地中&#xff0c;工人的安全是至关重要的&#xff0c;而工地安全帽的佩戴是保障工人安全的重要措施之一。然而&#xff0c;由于工地环境复杂多变&#xff0c;工人的佩戴情况往…

网络安全之权限维持那点事

权限维持 一旦黑客成功地入侵了目标系统&#xff0c;他们通常会尝试保持对系统的持久访问权&#xff0c;以便继续执行恶意活动&#xff0c;如窃取敏感数据、植入恶意软件、破坏系统功能等。 权限维持的过程可能包括以下几个方面&#xff1a; 后门植入&#xff1a;黑客可能会在…

蓝桥杯单片机要点——第十二届省赛(含代码)

题目&#xff1a; 用到的模块&#xff1a; LED单个点亮&#xff08;建议用sbit&#xff0c;文件开头定义单个引脚&#xff09; 数码管动态显示 矩阵键盘 ds18b20&#xff0c;用到onewire.c DAC转化&#xff08;步骤见文章末尾的易错点&#xff09;&#xff0c;用到iic.c m…

一本书了解AI的下一个风口:AI Agent

在数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动现代社会前进的强劲引擎。 从智能手机的智能助手到自动驾驶汽车的精准导航&#xff0c;AI技术的应用已经渗透到生活的方方面面。 随着技术的飞速发展&#xff0c;我们正站在一个新的转折点上&#xff…

Playwright安装和基本使用(ui/web自动化)

1.简介 Playwright是2021年微软开源的一个项目「playwright-python」。针对 Python 语言的纯自动化工具&#xff0c;它可以通过单个API自动执行 Chromium&#xff0c;Firefox 和 WebKit 浏览器&#xff0c;同时支持以无头模式、有头模式运行。 Playwright&#xff08;Git&…

美国CPC认证是什么认证

美国CPC认证是一种针对儿童产品的认证&#xff0c;旨在确保这些产品的安全性。CPC全称为Consumer Product Certification&#xff0c;即消费品认证&#xff0c;是美国消费品安全委员会&#xff08;CPSC&#xff09;所推行的一种自愿性认证制度。通过CPC认证的产品&#xff0c;意…