当前位置: 首页 > news >正文

TypeScript 基础

类型注解

类型注解:约束变量的类型

示例代码:

let age:number = 18

  • 说明:代码中的 :number 就是类型注解

  • 解释:约定了类型,就只能给变量赋值该类型的值,否则,就会报错

错误演示:

错误代码:

错误原因:将string类型的值赋值给了number类型的变量,类型不一致

let age:number = '18'

注意:ts 在编写代码的时候报错多了,但是在浏览器中执行的时候报错少了

TypeScript 类型概述

可以将 TS 中的常用基础类型分为两大类:

  • JS 自有类型

    • 简单类型(number string boolean undefined null

    • 复杂数据类型(数组,对象,函数等)

  • TS 新增类型

    • 联合类型

    • 自定义类型

    • 接口

    • 元组

    • 字面量类型

    • 枚举

    • void

    • any

    • 泛型

    • ...

简单类型

  • 自有类型 - 简单类型:number/string/boolean/undefined/null

  • 特点:简单,这些类型,完全按照 JS 中类型的名称来书写

let num: number = 123

let str: string = 'abc'

let flag: boolean = true

let undefinedValue: undefined = undefined

let nullValue: null = null

数组类型

数组类型的两种写法:

// 方式一

// 语法:let 变量名: 类型[] = 数组值

let arr1: number[] = [1, 2, 3]

let arr2: string[] = ['a', 'b', 'c']

// 方式二(泛型)

// 语法:let 变量名: Array<类型> = 数组值

let arr3: Array<number> = [1, 2, 3]

let arr4: Array<string> = ['a', 'b', 'c']

注意:推荐使用方式一的写法

联合类型

联合类型:将多个类型联合在一起,成为一个类型。

// 需求1:一个变量,既可以是数字,又可以是字符串

let temp: number | string = 123

temp = 'abc'

// 需求2:一个数组,里面既有数字,又有字符串

let arr1: (number | string)[] = [1, 2, 3, 'a']

let arr2: Array<number | string> = [1, 2, 3, 'a']

自定义类型(类型别名)

自定义类型:当一个结构复杂的类型被多次使用时,可以创建一个自定义类型,来简化类型的使用。

  1. 使用 type 关键字,自定义一个类型

  2. 语法:type 自定义类型名字 = 具体的类型

  3. 自定义类型的名字推荐使用大写字母开头

let arr1: (number | string | boolean)[] = [1, 'a', true]

let arr2: (number | string | boolean)[] = [2, 'b', false]

// 方式一

type ArrType = (number | string | boolean)[]

let arr1: ArrType = [1, 'a', true]

let arr2: ArrType = [2, 'b', false]

// 方式二

type ArrItemType = number | string | boolean

let arr1: ArrItemType[] = [1, 'a', true]

let arr2: ArrItemType[] = [2, 'b', false]

函数类型

基本使用

函数类型:其实就是指定函数的 参数返回值 的类型。

方式一:分别给参数和返回值添加类型

// 声明式函数

function sum(n1: number, n2: number): number {

  return n1 + n2

}

// 箭头函数写法

const sum = (n1: number, n2: number): number => {

  return n1 + n2

}

方式二:给函数整体添加类型

// 定义一个函数整体的类型(类似于箭头函数的写法)

type FnType = (n1: number, n2: number) => number

// 只有箭头函数能使用该方式

const sum: FnType = (n1, n2) => {

  return n1 + n2

}

void 类型

void 类型:函数没有返回值时,返回值的类型为 void

// 如果函数没有返回值,返回值的类型是 void。

const sum = (n1: number, n2: number): void => {

  console.log(n1 + n2)

}

// 如果函数没有返回值,返回值的类型也可以不写

const sum = (n1: number, n2: number) => {

  console.log(n1 + n2)

}

函数的可选参数

可选参数:当函数的参数可传可不传时,给函数的参数指定类型时,就需要使用可选参数。

比如:数组的 slice 方法,可以 slice() 也可以 slice(1) 还可以 slice(1, 3)

// 可选参数:在可传可不传的参数后面添加一个 ?

const mySlice = (start?: number, end?: number) => {

  console.log(start, end);

}

mySlice()

注意:可选参数 和 参数默认值,互斥,不能同时使用

对象类型

对象类型:对象是由属性和方法构成的。 所以 TS 的对象的类型,就是描述对象中的属性方法的类型。

对象中的属性类型

// 在一行代码中指定对象的多个属性类型时,使用分号进行分隔

let person: { name: string; age: number } = {

  name: 'zs',

  age: 18

}

// 通过换行来指定对象的多个类型,可以省略分号

let person: {

  name: string

  age: number

} = {

  name: 'zs',

  age: 18

}

// 可以将类型提取出来

type PersonType = {

  name: string

  age: number

}

let person: PersonType = {

  name: 'zs',

  age: 18

}

对象中的函数类型

// 方式一

// 语法:函数名(参数: 参数类型): 返回值类型

let person: {

  name: string

  age: number

  sayHi(friend: string): void

} = {

  name: 'zs',

  age: 18,

  sayHi(friend) {

    console.log('你好', friend)

  }

}

// 方式二

// 语法:函数名: (参数: 参数类型) => 返回值类型

let person: {

  name: string

  age: number

  sayHi: (friend: string) => void

} = {

  name: 'zs',

  age: 18,

  sayHi(friend) {

    console.log('你好', friend)

  }

}

对象的可选属性或方法

在对象的属性或方法名后面加一个 ? 问号

type StudengType = {

  name: string

  gender: string

  age: number

  score?: number

  study?(): void

  play(): void

}

let student = {

  name: 'zs',

  gender: '男',

  age: 18,

  // score: 100,

  // study() {},

  play() {}

}

interface接口类型

基本使用

interface:可以定义对象的类型。

interface Person {

  name: string

  age: number

  sayHi(): void

}

let person: Person = {

  name: 'zs',

  age: 18,

  sayHi() {}

}

注意:interface 不能写在一行,加不加分号都可以

interface vs type

  • 相同点:都可以给对象定义类型

  • 不同点:

    • interface:只能为对象定义类型

    • type:不仅可以为对象定义类型,它还可以定义其他的任意类型

    • type 不能重复定义,interface 可以重复定义,重复定义的内容会合并

  • 推荐:能用 type 就用 type

// 使用 interface 定义对象类型

interface Person {

  name: string

  age: number

  sayHi(): void

}

// 使用 type 定义对象类型

type Person = {

  name: string

  age: number

  sayHi(): void

}

// person 对象

let person: Person = {

  name: 'zs',

  age: 18,

  sayHi() {}

}

// interface 可以重复定义,重复定义的内容会合并

// 重复定义的使用场景:为项目中引入的第三方库添加新的类型时可以使用

interface Person {

  name: string

  age: number

}

interface Person {

  sayHi(): void

}

// type 不能重复定义

type Person = {

  name: string

  age: number

}

type Person = {

  sayHi(): void

}

interface 继承

interface 继承:如果两个 interface 之间有相同的属性或方法,可以将公共的属性或方法抽离出来,通过继承来实现复用

  • 比如:这两个接口都有 x、y 两个属性,重复写两次,可以,但很繁琐

interface Point2D {

  x: number

  y: number

}

let point2D: Point2D = {

  x: 100,

  y: 100

}

interface Point3D {

  x: number

  y: number

  z: number

}

let point3D: Point3D = {

  x: 100,

  y: 100,

  z: 100

}

更好的方式:

interface Point2D {

  x: number

  y: number

}

interface Point3D extends Point2D {

  z: number

}

let point2d: Point2D = {

  x: 100,

  y: 200

}

let point3d: Point3D = {

  x: 100,

  y: 200,

  z: 300

}

type 的交叉类型也可以实现继承的功能

type Point2D = {

  x: number

  y: number

}

type Point3D = Point2D & {

  z: number

}

let point2d: Point2D = {

  x: 100,

  y: 200

}

let point3d: Point3D = {

  x: 100,

  y: 200,

  z: 300

}

Tuple元组类型

元组类型:是特殊的数组类型,它确切地知道数组具体包含多少个元素,以及每个元素的类型

使用示例:在地图中,使用经纬度来标记坐标位置

  • 使用数组类型

// 使用数组类型的缺点:不严谨,因为该类型的数组中可以出现任意多个数字

let position: number[] = [116.2317, 39.5427]

使用元祖类型

let position: [number, number] = [39.5427, 116.2317]

类型推断

类型推断:在 TS 中,某些没有明确指出类型的地方,TS 会自动推断出类型

换句话说:由于类型推断的存在,有些地方的类型注解可以省略不写

发生类型推断的 2 种常见场景:

  1. 声明变量并初始化时

  2. 函数的返回值

// 1. 发生类型推断的场景1:声明变量并初始化时

let age = 18

// 相当于

let age: number = 18

// 2. 发生类型推断的场景2:函数的返回值

const sum = (n1: number, n2: number) => {

  return n1 + n2

}

// 相当于

const sum = (n1: number, n2: number): number => {

  return n1 + n2

}

  • 推荐:对于初学者,类型注解尽量写全,后期能省略类型注解的地方就省略(充分利用TS类型推论的能力,提升开发效率)

  • 技巧:如果不知道类型,可以通过鼠标放在变量名称上,利用 VSCode 的提示来查看类型

相关文章:

TypeScript 基础

类型注解 类型注解&#xff1a;约束变量的类型 示例代码: let age&#xff1a;number 18 说明&#xff1a;代码中的 :number 就是类型注解 解释&#xff1a;约定了类型&#xff0c;就只能给变量赋值该类型的值&#xff0c;否则&#xff0c;就会报错 错误演示&#xff1a;…...

MySQL InnoDB引擎 和 Oracle SGA

MySQL InnoDB引擎和Oracle SGA有以下异同&#xff1a; 异同点&#xff1a; 两者都是用来管理数据存储和访问的。 它们都可以通过调整参数来优化性能。 它们都支持事务处理和ACID属性。 它们都可以通过备份和恢复来保护数据。 异点&#xff1a; MySQL InnoDB引擎是一种存储…...

JAVA开发与运维(web生产环境部署)

web生产环境部署&#xff0c;往往是分布式&#xff0c;和开发环境或者测试环境我们一般使用单机不同。 一、部署内容 1、后端服务 2、后台管理系统vue 3、小程序 二、所需要服务器 5台前端服务器 8台后端服务 三、所需要的第三方组件 redismysqlclbOSSCDNWAFRocketMQ…...

普通人,自学编程,5个必备步骤

天给大家分享个干货哈 普通人自学编程 想学成找到一份工作甚至进大厂 非常有效且必备的5个步骤 文章最后 还给大家提供了一些免费的学习资料 记得提前收藏起来 相信很多人在最开始学编程的时候 上来就是去网上找一套视频 或者买一本书直接开干 这种简单粗暴的方法其实是不对的 …...

kubernetes安全框架RBAC

目录 一、Kubernetes 安全概述 二、鉴权、授权和准入控制 2.1 鉴权(Authentication) 2.2 授权(Authorization) 2.3 准入控制 三、基于角色的权限访问控制&#xff1a; RBAC 四、案例&#xff1a;为指定用户授权访问不同命名空间权限 一、Kubernetes 安全概述 K8S安全控…...

【大数据面试题大全】大数据真实面试题(持续更新)

【大数据面试题大全】大数据真实面试题&#xff08;持续更新&#xff09; 1&#xff09;Java1.1.Java 中的集合1.2.Java 中的多线程如何实现1.3.Java 中的 JavaBean 怎么进行去重1.4.Java 中 和 equals 有什么区别1.5.Java 中的任务定时调度器 2&#xff09;SQL2.1.SQL 中的聚…...

Linux [常见指令 (1)]

Linux常见指令 ⑴ 1. 操作系统1.1什么事操作系统1.2选择指令的原因 2.使用工具3.Linux的指令操作3.1mkdir指令描述:用法:例子 mkdir 目录名例子 mkdir -p 目录1/ 目录2/ 目录3 3.2 touch指令描述:用法:例子 touch 文件 3.2pwd指令描述:用法:例子 pwd 3.4cd指令描述:用法:例子 c…...

进程控制下篇

进程控制下篇 1.进程创建 1.1认识fork / vfork 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程 #include<unistd.h> int main() {pid_t i fork;return 0; }当前进程调用fork&#xff0c;…...

PS学习笔记(零基础PS学习教程)

很多新手学习PS不知从何下手&#xff0c;做设计的第一阶段肯定是打牢基础&#xff0c;把工具用熟练&#xff1b;本期特别为大家整理了PS入门的学习笔记&#xff0c;把每个工具的用法整理了下来&#xff0c;在使用过程中有哪里不清楚的可以翻看来看看~ 一、ps的工作界面的介绍 …...

如何构建数据血缘系统

1、明确需求&#xff0c;确定边界 在进行血缘系统构建之前&#xff0c;需要进行需求调研&#xff0c;明确血缘系统的主要功能&#xff0c;从而确定血缘系统的最细节点粒度&#xff0c;实体边界范围。 例如节点粒度是否需要精确到字段级&#xff0c;或是表级。一般来说&#x…...

IPsec中IKE与ISAKMP过程分析(主模式-消息3)

IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息1&#xff09;_搞搞搞高傲的博客-CSDN博客 IPsec中IKE与ISAKMP过程分析&#xff08;主模式-消息2&#xff09;_搞搞搞高傲的博客-CSDN博客 阶段目标过程消息IKE第一阶段建立一个ISAKMP SA实现通信双发的身份鉴别和密钥交换&…...

深度学习技巧应用10-PyTorch框架中早停法类的构建与运用

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用10-PyTorch框架中早停法类的构建与运用,文章将介绍深度学习训练过程中的一个重要技巧—早停法,以及如何在PyTorch框架中实现早停法。文章将从早停法原理和实践出发,结合实际案例剖析早停法的优缺点及在PyTorch中的应…...

Linux文件系统权限

目录标题 文件权限文件和目录的一般权限文件的权限针对三类对象进行定义文件和目录中&#xff0c;r、w、x的作用 设置文件和目录的一般权限修改文件或目录的权限—chmod(change mode)命令权限值的表示方法—使用3位八进制数表示权限值的表示方法—使用字符串表示修改文件或目录…...

ctfshow之_萌新web1至web7

一、访问在线靶场ctfshow ctf.showhttps://ctf.show/challenges如下图所示&#xff0c;进入_萌新赛的web1问题&#xff1a; 如上图所示&#xff0c;页面代码提示id1000时&#xff0c;可以查询到flag&#xff0c;进行如下尝试&#xff1a; 如下图所示&#xff0c;传入参数id1时…...

HPDA的资料

HPDA&#xff0c;英文全称为High Performance Data Analysis&#xff0c;直译为高性能数据分析。 适用场景 机器学习大数据分析 技术挑战 大量的元数据操作数据的同步随机读写高IOPOS的小IO请求高带宽的文件请求 技术关键字 存算分离移动计算大I/O直通&#xff0c;小I/O聚…...

项目管理软件可以用来做什么?这篇文章说清楚了

项目管理软件是用来干嘛的&#xff0c;就得看对项目的理解。项目是为创造独特的产品、服务或成果而进行的临时性工作。建造一座大楼可以是一个项目&#xff0c;进行一次旅游活动、日常办公活动、期末考试复习等也都可以看成一个项目。 项目管理不善会导致项目超时、超支、返工、…...

ETL工具 - Kettle 转换算子介绍

一、Kettle 转换算子 上篇文章对 Kettle 中的输入输出算子进行了介绍&#xff0c;本篇文章继续对转换算子进行讲解。 下面是上篇文章的地址&#xff1a; ETL工具 - Kettle 输入输出算子介绍 转换是ETL里面的T&#xff08;Transform&#xff09;&#xff0c;主要做数据转换&am…...

界面设计的读书笔记

所见即所得&#xff0c;属于绝大多数的人。 所想即所想&#xff0c;属于极少数的人。 当复杂度&#xff0c;超出了大脑的负荷&#xff0c;人会觉得很累&#xff0c;直到放弃追求。 地图的显示&#xff0c;必须有足够多的描述性的数据。 点信息 &#xff1a;标签&#xff0c;位…...

C#底层库--自定义进制转换器(可去除特殊字符,非Convert.ToString方式)

系列文章 C#底层库–程序日志记录类 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/124187709 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csd…...

Doris(24):Doris的函数—聚合函数

1 APPROX_COUNT_DISTINCT(expr) 返回类似于 COUNT(DISTINCT col) 结果的近似值聚合函数。 它比 COUNT 和 DISTINCT 组合的速度更快,并使用固定大小的内存,因此对于高基数的列可以使用更少的内存。 select city,approx_count_distinct(user_id) from site_visit group by c…...

干货! ICLR:将语言模型绑定到符号语言中个人信息

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; ╱ 作者简介╱ 承洲骏 上海交通大学硕士生&#xff0c;研究方向为代码生成&#xff0c;目前在香港大学余涛老师的实验室担任研究助理。 个人主页&#xff1a;http://blankcheng.github.io 谢天宝 香港大学一年级…...

Windows安装mariadb,配置环境变量(保姆级教学)

软件下载地址&#xff1a;https://mariadb.com/downloads/ 1.双击下载好的软件 2.点击next 3.勾选我同意&#xff0c;点击next 4.这里那你可以设置你要安装的路径&#xff0c;也可以使用默认的&#xff0c;之后点击next 5.如图所示&#xff0c;设置完点击next 6.接下来就默…...

华为OD机试 - 积木最远距离(Python)

题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处位置最远的2块积木块,计算他们的距离,小薇请你帮忙替她解决这个问题。 输入描…...

关于对于springcloud中的注册中心和consume消费者和provier服务者之间的关系理解

关于对于springcloud中的注册中心和consume消费者和provier服务者之间的关系理解 pringCloud provider&#xff08;服务提供方&#xff09; consumer&#xff08;服务调用方&#xff09; server&#xff08;注册中心&#xff09; 运行原理 Provider 第一步 provider注册到se…...

【学习笔记】「JOISC 2022 Day1」错误拼写

久违的字符串计数题。 显然只用考虑 [ i : j ] [i:j] [i:j]这一段拼成的串。不难得出结论&#xff1a;设 n x t i nxt_i nxti​表示 i i i之后第一个本质不同的字符的位置&#xff0c;那么 n x t i ≤ j nxt_i\le j nxti​≤j&#xff0c;并且 s i ? s n x t i s_i?s_{nxt_i…...

码出高效:Java开发手册笔记(线程池及其源码)

码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09; 码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09; 码出高效&#xff1a;Java开发手册笔记&#xff08;线程池及其源码&#xff09;前言一、线程池的作用线程的生命周…...

【MySQL】交叉连接、自然连接和内连接查询

一、引入 实际开发中往往需要针对两张甚至更多张数据表进行操作&#xff0c;而这多张表之间需要使用主键和外键关联在一起&#xff0c;然后使用连接查询来查询多张表中满足要求的数据记录。一条SQL语句查询多个表&#xff0c;得到一个结果&#xff0c;包含多个表的数据。效率高…...

长/短 链接/轮询 和websocket

短连接和长连接 短连接&#xff1a; http协议底层基于socket的tcp协议&#xff0c;每次通信都会新建一个TCP连接&#xff0c;即每次请求和响应过程都经历”三次握手-四次挥手“优点&#xff1a;方便管理缺点&#xff1a;频繁的建立和销毁连接占用资源 长连接&#xff1a; 客…...

数据库的事务

数据库的事务 1、事务是什么 TRANSACTION&#xff08;事务&#xff09;是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。 2、事务可以做什么 数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的&#xff1a; …...

专利进阶(二):专利撰写常用技术及算法汇总(持续更新中)

文章目录 一、前言二、常用技术及算法2.1 区跨链技术2.2 聚类算法2.3 边缘算法2.4 蚁群算法2.4.1 路径构建2.4.2 信息素更新 2.5 哈希算法2.5.1 常见算法 2.6 数字摘要2.72.82.92.10 三、拓展阅读 一、前言 专利撰写过程中使用已有技术或算法解决新问题非常常见&#xff0c;本…...

独立商城网站建设/容易被百度收录的网站

Range分区表建表语句如下&#xff0c;其中分区键必须和id构成主键和唯一键CREATE TABLE test1 (id char(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 自增主键(guid),create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,partition_key int(8) N…...

枣庄手机网站制作/网络营销专业毕业论文

类型1:内连接&#xff08;两张表相同数据都显示&#xff09; SELECT A.PK AS A_PK,A.Value AS A_Value,B.PK AS B_PK,B.Value AS B_ValueFROM table_a A INNER JOIN table_b B ON A.PK B.PK; 注意事项&#xff1a; 1、on 表示连接条件&#xff1b;条件字段代表相同的业务含义…...

南宁seo平台标准/seo综合查询中的具体内容有哪些

1.Jmeter 基本介绍 简单的说&#xff0c;就是Jmeter能做 功能测试 和 性能测试 。它能够对HTTP和FTP服务器进行压力和性能测试&#xff0c; 也可以对任何数据库进行同样的测试&#xff0c;还能以多种形式展现测试结果。 比如&#xff0c;我一 开始使用这个工具就是为了接口测试…...

有做微信婚介网站的吗/建站平台哪家好

判断移动端或pc端 经常在项目中会有支持 pc 与手机端需求。并且pc与手机端是两个不一样的页面。这时就要求判断设置&#xff0c;根据不同的设置跳转不同的路由。 先写个方法&#xff1a; //APP.vue isMobile() {let flag navigator.userAgent.match(/(phone|pad|pod|iPhon…...

网站免费正能量软件下载/滴滴友链

static最显著的两个作用&#xff1a;在类中修饰成员变量&#xff0c;修饰成员函数。这表示这些成员变量和成员函数是属于类的&#xff0c;不属于某个具体实例。初始化静态成员变量在进入main函数之前进行&#xff0c;且初始化只进行一次(如何建立单例&#xff0c;就是从这里入手…...

网站怎么提高权重/网络推广合同

编码规范之低级BUG Author&#xff1a;OnceDay Date&#xff1a;2022年7月16日 1.要求 低级bug务必在代码自审的时候解决。 重点在于编程思维模型的优化。 2.九类低级BUG 编号BUG类型1内存使用后未释放2使用已释放的内存3变量未有效初始化&#xff08;特别是指针变量&…...