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

TypeScript初学

文章转载:https://blog.csdn.net/weixin_46185369/article/details/121512287

写的很详细,适合初学者看看。

一、TypeScript是什么?

1.TypeScript简称:TS,是JavaScript的超集。简单来说就是:JS有的TS都有。JS写的代码在T的环境下都能跑。

2.在JS基础之上,为JS添加了类型支持。TypeScript = Type + JavaScript

3.TypeScript是微软开发的开源编程语言,可以在任何运行JavaScript的地方运行

// TypeScript  代码有明确的数据类型
let age1: number = 18
// JavaScript  代码没有明确的类型
let age2 = 18

二、为什么要为JS添加类型支持?

JS的缺陷

1.JS的类型系统是弱类型的,没有类型的概念

let ar = 11  // 这里是数值
ar = []  // 偷偷的改成了数组类型
arr.toFixed(2) // 这里会报类型错误

没有类型检验,导致了在使用JS进行项目开发时,会经常遇到类型错误的问题。

2.JavaScript属于动态类型的编程语言

边解释边执行,错误只能在运行阶段才能发现

TS属于静态类型都编程语言

1.它要先编译,再执行。不能直接执行,需要编译成js才能执行

2.它会在编译期间做类型检查,从而提前发现错误。配合VSCode等开发工具,TS可以提前到编写代码的同时就发现代码中的类型错误,减少找bug、改bug时间

对比:

  • 使用JS:
  1. 在VSCode里面写代码
  2. 在浏览器中运行代码 --> 运行时,才会发现错误
  • 使用TS
  1. 在VSCode里面写代码 --> 写代码时就会发现错误
  2. 在浏览器中运行代码

三、TypeScript类型

常用基础类型

将ts中的常用基础类型分为两类

  • js已有类型
  1. 原始类型:number/string/boolean/null/undefined/symbol
  2. 对象类型:object(包括,数组、对象、函数等对象)
  • ts新增类型
  1. 联合类型
  2. 自定义类型(类型别名)
  3. 接口
  4. 元组
  5. 字面量类型
  6. 枚举
  7. void
  8. any 等

注意:

  1.原始类型在 TS 和 JS 中写法一致

  2.对象类型在 TS 中更加细化,每个具体的对象(比如,数组、对象、函数)都有自己的类型语法

原始类型

  • 原始类型:number/string/boolean/null/undefined/symbol
  • 特点:简单,这些类型,完全按照 JS 中类型的名称来书写
// 数值类型
let age: number = 18// 字符串类型
let myName: string = '小花'// 布尔类型
let isLoading: boolean = false// undefined
let un: undefined = undefined// null
let timer:null = null

联合类型

联合类型的格式

let 变量: 类型1 | 类型2 | 类型3 .... = 初始值 

 解释:|(竖线)在 TS 中叫做联合类型,即:由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种

let arr: (number | string)[] = [1, 'a', 3, 'b']

应用场景

  1. 定时器id
// | 联合类型// 联合类型1: 变量可以是两种类型之一
let timer:number|null = null
timer = 2// 联合类型2: 数组元素可以是两种类型之一
let arr: (number|string|boolean)[] = [1,2,3]arr[0] = '1'
arr[2] = true

数组类型

数组类型的格式

let 变量: 类型[ ] = [值1,...]

let 变量: Array<类型> = [值1,...]

// 写法一:
let numbers: number[] = [1, 3, 5] //  numbers必须是数组,每个元素都必须是数字// 写法二:
let strings: Array<string> = ['a', 'b', 'c'] //  strings必须是数组,每个元素都必须是字符串

拓展示例

如何定义一个数组,它的元素可能是字符串类型,也可能是数值类型。

分析,结合联合类型来使用

let arr:(number|string)[] = ['1',1]

类型别名 

 type 别名 = 类型

type s = string //定义const str1:s = 'abc'
const str2:string = 'abc'

作用

  1. 给类型起别名
  2. 定义了新类型

场景

给复杂类型起别名

// type NewType = string | number// let a: NewType = 1
// let b: NewType = '1'// let arr: NewType[] = [1, '1']type MyArr = (number | string) []
const arr:MyArr = [1, '1']

函数-单个定义

函数的类型

函数的类型实际上指的是:函数参数和返回值的类型

格式:

//普通函数

function 函数名(形参1:类型=默认值,形参2:类型=默认值):返回值类型 { } 

 

//箭头函数

const 函数名(形参1:类型=默认值,形参2:类型=默认值):返回值类型 => { }

示例

// 函数声明
function add(num1: number, num2: number): number {return num1 + num2
}// 箭头函数
const add = (num1: number=10, num2: number=20): number => {return num1 + num2
}add(1,'1') // 报错

对象类型-单独使用

格式

const 对象名: {
        属性名1:类型1,
        属性名2:类型2,
        方法名1(形参1: 类型1,形参2: 类型2): 返回值类型,
        方法名2:(形参1: 类型1,形参2: 类型2)=>返回值类型
} = { 属性名1: 值1,属性名2:值2  }

 可选属性用 ?

const 对象名: {属性名1?:类型1,属性名2:类型2 } = { 属性名2:值2 }  

 示例

const goodItem:{name:string,price:number,func:()=>string} = {name:'手机',price:2000,func:function(){return '打电话'}
}

说明:

  1. 使用 {} 来描述对象结构
  2. 属性采用属性名: 类型的形式,如果是多行,可以省略,
  3. 方法采用方法名(): 返回值类型的形式
  4. 可选使用 ?

对象类型-接口

格式

interface 接口名  {
    属性1: 类型1,

    属性2: 类型2,
}

示例

interface IGoodItem {name:string,price:number,func:()=>string
}const good1:IGoodItem = {name:'手表',price:2000,func:function(){return '看时间'}
}const good2:IGoodItem = {name:'手机',price:2000,func:function(){return '打电话'}
}

解释:

  1. 使用 interface 关键字来声明接口
  2. 接口名称(比如,此处的 IPerson),可以是任意合法的变量名称,推荐以 I 开头
  3. 声明接口后,直接使用接口名称作为变量的类型

 接口和类型的区别

interface(接口)和 type(类型别名)的对比:

  • 相同点:都可以给对象指定类型
  • 不同点:
    • 接口,只能为对象指定类型。它可以继承。
    • 类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名

推荐:能使用type就是用type

//接口的写法
interface IPerson {name:string,age:number
}const user:IPerson = {name:'a',age:20
}
//type的写法
type Person = {name:string,age:number
}const user:Person = {name:'a',age:20
}

 接口继承

继承格式

interface 接口2 extends 接口1 {

     属性1:类型1,    //接口2中特有的类型

     ....

}

示例

interface Point2D{ x:number; y:number}//继承Point2D
interface Point3D extends Point2D {z:number
}

 解释:

  1. 使用 extends(继承)关键字实现了接口 Point3D 继承 Point2D
  2. 继承后,Point3D 就有了 Point2D 的所有属性和方法(此时,Point3D 同时有 x、y、z 三个属性)

泛型

 

 

四、VSCode中的编码技巧

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

  • 写代码的时候,多看方法、属性的类型,养成写代码看类型的习惯

 

相关文章:

TypeScript初学

文章转载&#xff1a;https://blog.csdn.net/weixin_46185369/article/details/121512287 写的很详细&#xff0c;适合初学者看看。 一、TypeScript是什么&#xff1f; 1.TypeScript简称&#xff1a;TS&#xff0c;是JavaScript的超集。简单来说就是&#xff1a;JS有的TS都有…...

C/C++预定义宏

MSVC文档&#xff1a; https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros?viewmsvc-170 GCC文档&#xff1a; https://gcc.gnu.org/onlinedocs/gcc/Function-Names.html https://gcc.gnu.org/onlinedocs/cpp/Predefined-Macros.html 参考&#xff1a;…...

原型链污染挖掘(存储XSS)

服务XSS响应 将JSON content-type更改为HTML 在Express应用中使用 JSON内容类型响应 并反映一个JSON&#xff1a; app.use(bodyParser.json({type: application/json})); app.post(/, function(req, res){_.merge({}, req.body);res.send(req.body); }); 在这些情况下&…...

Chrome开发者工具介绍

Chrome开发者工具介绍 前言1 打开DevTools2 命令菜单3 Elements面板ConsoleJavaScript调试Network 前言 Chrome开发者工具是谷歌浏览器自带的一款开发者工具&#xff0c;它可以给开发者带来很大的便利。常用的开发者工具面板主要包含Elements面板、Console面板、Sources面板、…...

利用MMPose进行姿态估计(训练、测试全流程)

前言 MMPose是一款基于PyTorch的姿态分析开源工具箱&#xff0c;是OpenMMLab项目成员之一&#xff0c;主要特性&#xff1a; 支持多种人体姿态分析相关任务&#xff1a;2D多人姿态估计、2D手部姿态估计、动物关键点检测等等更高的精度和更快的速度&#xff1a;包括“自顶向下”…...

ROS2 编译含有自定义消息项目报错:msg/detail/header__struct.h: 没有那个文件或目录

项目场景&#xff1a; 当迁移ROS 1 项目到 ROS 2 时&#xff0c;有时候会遇到消息类型的变化和更新&#xff0c;消息类型可能需要进行一些调整以适应新的ROS 2要求。本文将介绍如何处理自定义消息中的Header字段&#xff0c;以确保项目能够顺利地适应ROS 2的消息类型定义。 问…...

线段树思想拆解(下篇)

线段树思想拆解&#xff08;下篇&#xff09; 上篇回顾 到这里我们已经处理好了初始化以及添加方法&#xff0c;接下来实现范围的 query 方法 public int query(int queryL, int queryR) {return query(queryL, queryR, 1, orgLength - 1, 1);}到此为止通过借助 sum 数组&…...

Containerd容器镜像管理

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 1、Containerd镜像管理 1.1 Containerd容器镜像管理命令 docker使用docker images命令管理镜像单机containerd使用ctr images命令管理镜像,con…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前数据吞吐量(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取…...

Ubuntu服务器版配置wifi

最近把曾经不用的上网本安装了一个Ubuntu-Server版&#xff0c;当成服务器来用&#xff0c;因为家庭网络布线问题&#xff0c;只好用自带的WIFI来连接网络&#xff0c;Server版也没有什么图形化的管理工具&#xff0c;之后手动编辑配置文件了。 Server下面配置起来还是很方便的…...

Windows 主机的VMware 虚拟机访问 wsl-ubuntu 的 API 服务

Windows 主机的VMware 虚拟机访问 wsl-ubuntu 的 API 服务 0. 背景1. 设置2. 删除 0. 背景 需要从Windows 主机的VMware 虚拟机访问 wsl-ubuntu 的 API 服务。 1. 设置 Windows 主机的IP&#xff1a;192.168.31.20 wsl-ubuntu Ubuntu-22.04 的IP&#xff1a;172.29.211.52 &…...

【Spring】(一)Spring设计核心思想

文章目录 一、初识 Spring1.1 什么是 Spring1.2 什么是 容器1.3 什么是 IoC 二、对 IoC 的深入理解2.1 传统程序开发方式存在的问题2.2 控制反转式程序的开发2.3 对比总结 三、对 Spring IoC 的理解四、DI 的概念4.1 什么是 DI4.2 DI 与 IoC的关系 一、初识 Spring 1.1 什么是…...

chrome插件开发实例04-智能收藏夹

目录 功能说明 演示 源码下载 源代码 manifest.json popup.html popup.js background.js 功能说明 基于chrome插件࿰...

iOS技术之 手机系统15.0之后 的 UITableView section header多22像素问题

iOS 15 的 UITableView又新增了一个新属性&#xff1a;sectionHeaderTopPadding 会给每一个section header 增加一个默认高度&#xff0c;当我们 使用 UITableViewStylePlain 初始化 UITableView的时候&#xff0c;就会发现&#xff0c;系统给section header增高了22像素。 解…...

Windows下安装Kafka(图文记录详细步骤)

Windows下安装Kafka Kafka简介一、Kafka安装前提安装Kafka之前&#xff0c;需要安装JDK、Zookeeper、Scala。1.1、JDK安装&#xff08;version&#xff1a;1.8&#xff09;1.1.1、JDK官网下载1.1.2、JDK网盘下载1.1.3、JDK安装 1.2、Zookeeper安装1.2.1、Zookeeper官网下载1.2.…...

linuxARM裸机学习笔记(3)----主频和时钟配置实验

引言&#xff1a;本文主要学习当前linux该如何去配置时钟频率&#xff0c;这也是重中之重。 系统时钟来源&#xff1a; 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源&#xff0c; 24MHz 晶振是 I.MX6U 内核 和其它外设的时钟源 1. 7路PLL时钟源【都是从24MHZ的晶振PLL而来…...

防勒索病毒

随着勒索软件攻击在2023年的激增&#xff0c;网络安全已成为当今最重要的议题之一。根据区块链分析公司Chainaanalysis的最新报告&#xff0c;勒索软件攻击已成为唯一呈增长趋势的基于加密货币的犯罪行为&#xff0c;勒索金额更是比一年前增加了近1.758亿美元&#xff0c;达到4…...

剑指 Offer 53 - II. 0~n-1 中缺失的数字

力扣 一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出这个数字。 示例 1: 输入: [0,1,3] 输出: 2 示例 2: 输入: [0,1,2,3,4,5…...

vue2和vue3区别

vue2和vue3的区别有以下8点&#xff1a; 1、双向数据绑定原理不同&#xff1b; 2、是否支持碎片&#xff1b; 3、API类型不同&#xff1b; 4、定义数据变量和方法不同&#xff1b; 5、生命周期钩子函数不同&#xff1b; 6、父子传参不同&#xff1b; 7、指令与插槽不同&#x…...

IMV3.0

经历了两个版本&#xff0c;基础内容在前面&#xff0c;可以使用之前的基础环境&#xff1a; v1&#xff1a; https://blog.csdn.net/wtt234/article/details/132139454 v2&#xff1a; https://blog.csdn.net/wtt234/article/details/132144907 一、代码组织结构 二、代码 2.…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...