TypeScript学习笔记一

news/2025/1/18 11:06:49/

文章目录

  • 一、类型注解
  • 二、TypeScript常用类型
    • 2.1 原始类型
    • 2.2 数组类型
    • 2.3 联合类型
    • 2.4 类型别名
    • 2.5 给函数添加类型
    • 2.6 对象类型
    • 2.7 对象的可选属性
    • 2.8 接口
    • 2.9 interface和type的对比
    • 2.10 接口继承
    • 2.11 元组
    • 2.12 类型推断
    • 2.13 类型断言
    • 2.14 字面量类型
    • 2.15 枚举
    • 2.16 any类型
    • 2.17 typeof


一、类型注解

// number就是类型注解
// 为变量添加类型约束,如下例:
// 约定变量num的类型为number(数值类型)
let num: number = 1

二、TypeScript常用类型

可以将TS中的常用基础类型细为两类:JS已有类型 TS新增类型
1、JS已有类型

  • 原始类型:number、string、boolean、null、undefined、symbol
  • 对象类型:object(包括数组、对象、函数等对象)

2、TS新增类型

  • 联合类型、自定义类型(类型别名)、接口、元组、字面量类型、枚举、void、any等

2.1 原始类型

按js中的方式来书写就可以了

let age:number = 18
let name:string = 'kangyun'
let isShow:boolean = true
let a: null = null
let b: undefined = undefined
let s: symbol = Symbol()

2.2 数组类型

// 数组类型的两种写法:推荐使用number[]的写法
let numbers: number[] = [1, 2, 3];
let strings: Array<string> = ["a", "b"];

2.3 联合类型

// 数组中即有number,又有string
// |在TS中叫做联合类型由两个或多个其他类型组成的类型
// 表示可以是这些类型中的任意一种
let arr:(string|number)[] = [1, 'a', 'abc']

2.4 类型别名

类型别名(自定义类型)为任意类型起别名
当同一类型(复杂)被多次使用时,可以通过类型别名,简化该类型的使用

// 使用type关键字来创建类型别名
// 创建类型别名后,就可以使用该类型别名作为变量的类型注解了
type CArray = (number|string)[]
let arr1:CArray = [1, 'ABC']

2.5 给函数添加类型

函数的类型实际上就是指定函数参数及返回值的类型

// 单独指定参数、返回值的类型
function add01(num1: number, num2: number): number {return num1 + num2;
}
// 使用函数表达式
const add = (num1: number, num2: number):number => {return num1 + num2
}

函数类型可以用箭头函数来表示
在这里插入图片描述
函数没有返回值

// 如果函数没有返回值,那么函数返回值类型为void
const greet01:(name:string)=>void = (name:string):void =>console.log(`hello,${name}`)
function greet02(name:string):void{console.log(`hello,${name}`)
}

函数的可选参数

// 参数可传可不传在后面添加?问号
// 可选参数只能出现在参数列表的最后,也就是说可选参数后面不能再出现必选参数
function MySlice(start?: number, end?: number):void{console.log('')
}

2.6 对象类型

// JS中的对象是由属性和方法构成的,而
// TS中对象的类型就是在描述对象结构(有什么类型的属性和方法)// 直接使用{}来描述对象结构
// 方法的类型也可以使用箭头函数的形式如:sayHi:()=>void
let person: {name: string; age:number; sayHai():void} = {name: 'jack',age: 18,sayHai(){}
}

2.7 对象的可选属性

// 对象的属性或方法也可以是可选的
// 如我们在使用axios({.....})如果发送GET请求
// method属性就可以省略
function myAxios(config: {url: string, method?: string}){console.log('')
}

2.8 接口

// 当一个对象类型被多次使用时
// 一般会使用接口来描述对象类型,达到复用的目的interface IPerson {name: string;age: number;sayHai: () => void;
}let person: IPerson = {name: "张三",age: 18,sayHai() {},
};

2.9 interface和type的对比

相同点:都可以给对象指定类型
不同点:

  • 接口,只能为对象指定类型
  • 类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名
    如下接口就做不到
type NumStr = number | string

2.10 接口继承

// 如果两个接口之间有相同的属性或方法
// 就可以将公共的属性或方法剥离出来
// 通过继承来实现复用// 如下两段代码,x,y两个属性,重复写两次
// 很繁琐
interface Point2D01{x: number, y: number}
interface Point3D01{x: number, y: number, z: number}
// 更好的方式
interface Point2D02{x: number, y: number}
// 继承后Point3D02就有了Point2D02所有属性和方法
interface Point3D02 extends Point2D02{z: number}

2.11 元组

使用数组来记录坐标,那么该数组中有两个元素,并且这两个元素都是数值类型

let position: number[] = [22.333, 33.333]

使用number[]的缺点:不严谨,因为该类型的数组中可以出现任意多个数字
更好的方式:元组(Tuple)
元组类型是另一种类型的数组,它确切的知道包含多少个元素,以及特定索引对应的类型。

let position: [number, number] = [22.333, 33.333]

2.12 类型推断

在TS中,某些没有明确指出类型的地方,TS的类型推论机制会帮助提供类型
就是说由于类型推断的存在,某些地方类型注解可以省略不写
发生类型推论的两种场景:

  • 声明变量并初始化时
  • 决定函数返回值时
    如果不知道类型时,可以通过鼠标放在变量名上,利用vscode的提示来查看类型。
    实战时最好不省略

2.13 类型断言

程序员会比TS更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型。
如下例:
在这里插入图片描述
getElementById方法返回值的类型是HTMLElement,该类型只包含所有标签公共的属性或方法,不包含a标签特有的href等属性。
因此这个类型太宽泛,无法操作href等a标签特有的属性或方法,解决方法就是使用类型断言指定更加具体的类型。
在这里插入图片描述

2.14 字面量类型

如下两个变量的类型分别是什么?

let str1 = 'Hello TS'
const str2 = 'Hello TS'

通过TS类型推断机制得到答案

  • 变量str1的类型为string
  • 变量str2的类型为’Hello TS’

str1是一个变量,它的值可以是任意字符串,所以类型为: string
str2是一个常量,它的值不能变化只能是’Hello TS’,它的类型是’Hello TS’
此处的’Hello TS’就是一个字面量类型。也就是说某个特定的字符串也可以作为TS中的类型。
除字符串外,任意的JS字面量(如对象,数字等)都可以作为类型使用

使用字面量的场景:
字面量类型配置联合类型一起使用。

function changeDirection(direction: 'up' | 'down' | 'left' | 'right'){console.log(direction)
}

2.15 枚举

枚举的功能类似于字面量类型+联合类型组合的功能,也可以表示一组明确的可选值。
枚举:定义一组命名常量。它描述一个值,这个值可以是这些命名常量中的一个。

enum Direction {Up,Down,Left,Right,
}
function changeDirection(direction: Direction) {console.log(direction);
}
changeDirection(Direction.Left);
  • 使用enum关键字定义枚举
  • 约定枚举名称、枚举中的值以大写字母开头
  • 枚举中的多个值之间通过,分隔

我们把枚举成员作为函数的实参,它的值是什么呢?

changeDirection(Direction.Left);

枚举成员是有值的,默认为0开始自增的数值,称为数字枚举
也可以给枚举中的成员初始化值

enum Direction {Up = 10, Down, Left, Right }
enum Direction {Up = 10, Down = 20, Left = 30, Right = 40 }

自符串枚举

enum Dicrection {Up = 'UP',Down = 'DOWN',Left = 'LEFT',Right = 'RIGHT'
}

字符串枚举没能 自增长行为,因此,字符串枚举的每个成员必须有初始值。
枚举在编译的时候会被翻译成JS代码

2.16 any类型

尽可能的避免使用any类型,除非临时使用any来避免书写很长、很复杂的类型
其他隐式具有any类型的情况

  • 声明变量不提供类型也不提供默认值
  • 函数参数不加类型

不推荐使用any,所以以上两种情况下都应该提供类型

2.17 typeof

JS中提供了typeof操作符,用来在JS中获取数据的类型

console.log(typeof 'hello,world')

TS也提供了typeof操作符,可以在类型上下文中引用变量或属性的类型(类型查询)

let p = {x: 1, y: 2 }
function formatPoint01(point: {x: number; y: number}){}
function formatPoint02(point: typeof p){}

http://www.ppmy.cn/news/37097.html

相关文章

选择很重要,骑友,怎么挑选骑行装备?

骑行装备的重要性&#xff0c;已经不用多说了&#xff0c;大家也都知道。但是如何挑选&#xff0c;如何选择适合自己的骑行装备呢&#xff1f;今天我来和大家聊一聊这个问题。首先我们需要了解一个概念&#xff1a;骑行装备分为两大类&#xff1a;骑行服和骑行鞋。对于公路车来…

Git常用指令

Git是什么&#xff1a; Git是分布式版本控制系统&#xff08;Distributed Version Control System&#xff0c;简称 DVCS&#xff09;&#xff0c;分为两种类型的仓库&#xff1a; 本地仓库和远程仓库 第一步先新建仓库&#xff0c;本地 init ,然后提交分枝 链接仓库&#xf…

★DDR相关

1.速率&#xff0c;电压 DDR3&#xff1a;800-2133Mbps&#xff1b;1.5V&#xff08;VDDQ&#xff09; DDR4&#xff1a;1600-3200Mbps&#xff1b;1.2V&#xff08;VDDQ&#xff09; 1&#xff1a;tCK1.25ns&#xff0c;芯片支持最大IO时钟频率&#xff08;DDR3频率&#xf…

TensorFlow详解1

一、TensorFlow详细架构 1、前端&#xff08;编程模型采用python、c、java&#xff09; 2、后端&#xff08;运行采用c&#xff09; 二、TensorFlow特点 1、灵活性&#xff1a;只要可以将计算表示成数据流图&#xff0c;就可以使用TensorFlow&#xff1b; 2、跨平台性&…

jwt 的鉴权过程与安全性分析

&#xff08;一&#xff09;讲一下jwt 鉴权原理 JWT&#xff08;JSON Web Token&#xff09;是一种基于标准JSON格式的轻量级身份认证和授权协议。JWT由三部分组成&#xff1a;Header&#xff08;头部&#xff09;、Payload&#xff08;载荷&#xff09;和Signature&#xff0…

八 SpringMVC【拦截器】登录验证

目录&#x1f6a9;一 SpringMVC拦截器✅ 1.配置文件✅2.登录验证代码&#xff08;HandlerInterceptor&#xff09;✅3.继承HandlerInterceptorAdapter&#xff08;不建议使用&#xff09;✅4.登录页面jsp✅5.主页面&#xff08;操作页面&#xff09;✅6.crud用户在访问页面时 只…

【Linux面试】-(腾讯,百度,美团,滴滴)

文章目录Linux 面试题-(腾讯,百度,美团,滴滴) 分析日志 t.log(访问量)&#xff0c;将各个 ip 地址截取&#xff0c;并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://19…

C++运算符重载基础教程

所谓重载&#xff0c;就是赋予新的含义。函数重载&#xff08;Function Overloading&#xff09;可以让一个函数名有多种功能&#xff0c;在不同情况下进行不同的操作。运算符重载&#xff08;Operator Overloading&#xff09;也是一个道理&#xff0c;同一个运算符可以有不同…