Typescript:(一)基本使用

news2025/1/9 2:03:56

TypeScript

定义:Typescript是拥有类型的JavaScript超集 它可以编译成普通,干净,完整的JavaScript代码

我们可以将TypeScript理解成加强版的JavaScript。
JavaScript所拥有的特性,TypeScript全部都是支持的,并且它紧随ECMAScript的标准,所以ES6、ES7、ES8等新语法标准,它都是支持的;
TypeScript在实现新特性的同时,总是保持和ES标准的同步甚至是领先;
并且在语言层面上,不仅仅增加了类型约束,而且包括一些语法的扩展,比如枚举类型(Enum)、元组类型(Tuple)等;
并且TypeScript最终会被编译成JavaScript代码,所以你并不需要担心它的兼容性问题,在编译时也可以不借助于Babel这样的工具;

注意 刚开始学习ts时写.ts文件容易报重复声明的错误 因为不是进行模块化开发 所以建议在每个文件的开头或结尾加上export {}就不会报错了

export {}

TypeScript的编译环境

我们需要在电脑上安装TypeScript,这样就可以通过TypeScript的Compiler将其编译成JavaScript;

安装命令

 npm install typescript -g

#查看版本

tsc --version

我们可以使用ts-node快速查看TypeScript代码的运行效果
安装ts-node

npm install ts-node -g

ts-node需要依赖 tslib 和 @types/node 两个包

npm install tslib @types/node -g

我们可以直接通过 ts-node 来运行TypeScript的代码

ts-node .ts文件

变量的声明

在TypeScript中定义变量需要指定标识符的里欸选哪个
声明格式如下
var/let/const 标识符: 数据类型 = 赋值;
声明了类型后TypeScript就会进行类型检测 声明类型可以称之为类型注解

let message: string = 'hello world';

如果我们给message赋值其他类型的值 那么就会报错
在这里插入图片描述

声明变量的关键字

在TypeScript定义变量(标识符)和ES6之后一致,可以使用var、let、const来定义。

var name: string = 'kobe'
let age: number = 20
const height: number = 1.90

但是在TypeScript不推荐使用var关键字 主要原因和ES6升级后let和var的区别是一样的,var是没有块级作用域

变量的类型推导

在开发中,有时候为了方便起见我们并不会在声明每一个变量时都写上对应的数据类型,我们更希望可以通过TypeScript本身的
特性帮助我们推断出对应的变量类型

在这里插入图片描述
这是因为在一个变量第一次赋值时,会根据后面的赋值内容的类型,来推断出变量的类型

number类型

数字类型是我们开发中经常使用的类型,TypeScript和JavaScript一样,不区分整数类型(int)和浮点型(double),统一为
number类型。

let num: number = 10

学习过ES6应该知道,ES6新增了二进制和八进制的表示方法,而TypeScript也是支持二进制、八进制、十六进制的表示:

num = 100 //十进制
num = 0b110 //二进制
num = 0o555 //八进制
num = 0xf23 //十六进制

boolean类型

boolean类型只有两个取值:true和false,非常简单

let flag: boolean = true
flag = false
flag = 20 > 30

string类型

string类型是字符串类型,可以使用单引号或者双引号表示

let message:string = 'hello world'

Array类型

数组类型的定义也非常简单,有两种方式
Array事实上是一种泛型的写法 后面会提到

let names: string[] = ['abc', 'cba', 'nba'];
let nums: Array<number> = [123, 321, 111];

注意事项 数组一般存放相同的类型 不存放不同的类型

如果添加其他类型到数组中,那么会报错
在这里插入图片描述

Object类型

object对象类型可以用于描述一个对象:
type是用来声明类型

type InfoType = {
	name: string;
	age: number;
};

let info: InfoType = {
	name: '1231',
	age: 1231,
};

Symbol类型

const s1:symbol = Symbol('title')
const s2:symbol = Symbol('title')

const person ={
	[s1]:'程序员',
	[s2]:'老师'
}

null和undefined类型

在 JavaScript 中,undefined 和 null 是两个基本数据类型。
在TypeScript中,它们各自的类型也是undefined和null,也就意味着它们既是实际的值,也是自己的类型

let n: null = null
let u: undefined = undefined

函数的参数类型

函数是JavaScript非常重要的组成部分,TypeScript允许我们指定函数的参数和返回值的类型。
参数的类型注解
声明函数时,可以在每个参数后添加类型注解,以声明函数接受的参数类型:

function sum(num1: number, num2: number): number {
	return num1 + num2;
}

sum(123, 321);

函数的返回值类型

我们也可以添加返回值的类型注解,这个注解出现在函数列表的后面

function sum(num1: number, num2: number): number {
	return num1 + num2;
}

const res = sum(123, 321);

和变量的类型注解一样,我们通常情况下不需要返回类型注解,因为TypeScript会根据 return 返回值推断函数的返回类型:
在这里插入图片描述

匿名函数的参数

匿名函数与函数声明会有一些不同:
当一个函数出现在TypeScript可以确定该函数会被如何调用的地方时 该函数的参数会自动指定类型;

const names = ['abc', 'cba', 'nba'];
names.forEach(item => {
	console.log(item.toUpperCase())
})

我们并没有指定item的类型,但是item是一个string类型:
这是因为TypeScript会根据forEach函数的类型以及数组的类型推断出item的类型;
这个过程称之为上下文类型(contextual typing),因为函数执行的上下文可以帮助确定参数和返回值的类型;

对象类型 与 可选类型

对象类型也可以指定哪些属性是可选的,可以在属性的后面添加一个?:
如果我们希望限定一个函数接受的参数是一个对象,这个时候要如何限定呢

type PointType = {
	x: number;
	y: number;
	z?: number; //可选
};

function printCoordinate(point: PointType) {
	console.log('x坐标', point.x);
	console.log('y坐标', point.y);
}

printCoordinate({ x: 1, y: 2 });

any类型

在某些情况下,我们确实无法确定一个变量的类型,并且可能它会发生一些变化,这个时候我们可以使用any类型

const arr: any[] = [111, '111', true]

如果对于某些情况的处理过于繁琐不希望添加规定的类型注解,或者在引入一些第三方库时,缺失了类型注解,这个时候我们可
以使用any:包括在Vue源码中,也会使用到any来进行某些类型的适配;

unknow类型

unknown是TypeScript中比较特殊的一种类型,它用于描述类型不确定的变量。
和any类型有点类似,但是unknown类型的值上做任何事情都是不合法的;
要求必须进行类型校验 (缩小) 才能根据缩小后的类型进行对应的操作

let foo: unknown = 'aaa';
if (typeof foo === 'string') {//类型缩小
	console.log(foo.length, foo.split(''));
}

在这里插入图片描述
直接操作会报错
在这里插入图片描述

void类型

void通常用来指定一个函数是没有返回值的,那么它的返回值就是void类型

function sum(num1: number, num2: number): number {
	return num1 + num2;
}

在这里插入图片描述

这个函数我们没有写任何类型,那么它默认返回值的类型就是void的,我们也可以显示的来指定返回值是void

function sum(num1: number, num2: number): void {
	console.log(num1 + num2);
}

我们可以将undefined赋值给void类型,也就是函数可以返回undefined

当基于上下文的类型推导(Contextual Typing)推导出返回类型为 void 的时候,并不会强制函数一定不能返回内容。

type FnType = () => void;
const foo: FnType = () => {
	return 123;
};
console.log(foo());

在这里插入图片描述

never类型

never 表示永远不会发生值的类型,比如一个函数
如果一个函数中是一个死循环或者抛出一个异常 会推导出never

function foo(): never {
	// while (true) {
	// 	console.log('------');
	// }
	throw new Error('123');
}

foo();

tuple类型

tuple是元组类型,很多语言中也有这种数据类型,比如Python、Swift等

const info: [string, number, number] = ['kobe', 30, 1.88];
const value = info[2];

那么tuple和数组有什么区别呢?
首先,数组中通常建议存放相同类型的元素,不同类型的元素是不推荐放在数组中。(可以放在对象或者元组中)
其次,元组中每个元素都有自己特性的类型,根据索引值获取到的值可以确定对应的类型;

Tuple的应用场景

tuple通常可以作为返回的值,在使用的时候会非常的方便;
例如react的setState钩子函数 就可以使用tuple

// 在函数中使用元组类型是最多的(函数的返回值)
function useState(initialState: number): [number, (newValue: number) => void] {
	let stateValue = initialState;
	function setValue(newValue: number) {
		stateValue = newValue;
		//重新渲染组件
	}
	return [stateValue, setValue];
}

const [count, setCount] = useState(10);

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

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

相关文章

Linux系统挂载命令mount(U盘、移动硬盘、光盘)

Linux系统不像windows系统可以自动识别加载新设备&#xff0c;Linux系统需要手动识别&#xff0c;手动加载。Linux中一切皆文件。文件通过一个很大的文件树来组织&#xff0c;文件树的根目录是&#xff1a;/&#xff0c;从根目开始录逐级展开。这些文件通过若干设备铺展开。 命…

BCG 对话框表格控件CBCGPGridCtrl显示子

1、1、MFC窗口中拖放Picture Control 2、 void CSimpleGridSampleDlg::_FillGrid() { CWaitCursor wait; // Create grid tree: CRect rectClient; GetClientRect(rectClient); m_wndGrid.Create(WS_CHILD | WS_VISIBLE, rectClient, this, ID_GRID); m_wndGri…

SAR回波的多普勒特性

专栏目录链接: SAR成像专栏目录 今天我们来看看SAR回波的多普勒特性。 首先推导下正侧视下SAR回波的多普勒频率公式,前提条件: 正侧视不考虑平台运动的不稳定性忽略地球曲率忽略地球自转的影响 根据多普勒效应原理可得SAR回波的多普勒频率(可以回顾下:《雷达导论PART IV.…

C++之二叉搜索树详解

文章目录前言一、二叉搜索树的概念二、二叉搜索树的操作1.节点类2.二叉搜索树类内部定义3.遍历操作4.构造函数5.拷贝构造函数6.赋值运算符重载7.析构函数8.插入函数非递归实现递归实现9.删除函数非递归实现递归实现10.查找函数非递归实现递归实现三、二叉搜索树的应用K模型KV模…

索引和事务

文章目录 1.索引的含义以及应用 2.索引的查看、创建 3.带主键的索引底层结构 4.事务的含义 5.事务的特性 6.JDBC 一.索引的含义及应用 1.索引我们可以认为是文章的目录&#xff0c;有了它&#xff0c;我们可以更加快速的 查看到我们想要查找的内容。 2.并不是说我们加了索引&…

一周侃 | 周末随笔及推荐

前言 每周一次的闲聊胡侃又来啦&#xff01;这一周世界发生了许多大事&#xff0c;从举世瞩目的中美元首会晤到新的防疫政策二十条出来之后各地防疫政策的转变&#xff0c;再到俄乌冲突持续进行&#xff0c;联大通过俄罗斯赔偿计划……百年未有之大变局正加速演进&#xff0c;…

【k8s】8、service详解

文章目录一、Service详解1、Service介绍1.1 userspace模式1.2 iptables 模式1.3 ipvs模式2、Service类型3、Service使用3.1 实现环境准备3.2 Cluster类型的Service3.2.1 cluster类型的生成ip3.2.2 cluster类型不生成ip3.3 NodePort类型的service3.4 LoadBalancer类型的Service3…

【MySQL】MySQL体系结构与内部组件工作原理解析(原理篇)(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

GEE两行代码下载任意范围影像python API

GEE三行代码下载任意范围影像 前不久&#xff0c;吴秋生博士更新了geemap&#xff0c;现在能更方便地下载影像了最新的下载再也不受有限的Google Drive、图像过大会自动分割、缓慢的下载速度影响了。 有兴趣的同学可以see this: https://geemap.org/notebooks/118_download_i…

蓝牙传输 LE Audio技术

蓝牙 蓝牙(Bluetooth)技术&#xff0c;实际上是一种短距离无线电技术&#xff0c;利用"蓝牙"技术&#xff0c;能够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信&#xff0c;也能够成功地简化以上这些设备与因特网Internet之间的通信&…

react(受控组件、生命周期、使用脚手架)

目录 使用脚手架 其他&#xff1a; 学习js: mdn 文档 MDN Web Docs 在react官方文档的 CDN 链接里下载最新的react版本react官网&#xff1a;React 官方中文文档 – 用于构建用户界面的 JavaScript 库 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1. 受控组件…

ES6 入门教程 15 Proxy 15.3 Proxy.revocable() 15.4 this 问题 15.5 实例:Web 服务的客户端

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程15 Proxy15.3 Proxy.revocable()15.4 this 问题15.5 实例&#xff1a;Web 服务的客户端15 Proxy 15.3 Proxy.revocable() …

BLDC的列子2

1.三相采样电流的采集以u相为举例。 采集下桥臂I-V的电压。在除以采样电阻。就可以得到采样电流。但由于I-V的电压比较小。 需要一个放大电路把电压放大ADC才采集的到。 放大后的电压是AMP_IU.用ADC去采集这个电压。从而算出I_V的电压。 在电机停止的时候也会有微小的电压。…

Azure 深入浅出[2] --- App Service的部署并查看应用Log

假设读者已经申请了Azure的免费订阅的账户。如果想部署一个前端NodeJS的服务到Azure的App Service应该如何部署并查看应用程序本身的日志呢&#xff1f;笔者在这边文章就带大家快速看一下。 1.环境准备 安装Visual Studio Code以及在Visual Studio Code里面安装Azure App Ser…

文件上传漏洞 | iwebsec

文章目录靶场搭建文件上传漏洞前端JS过滤绕过文件名过滤绕过Content-Type过滤绕过文件头过滤绕过.htaccess文件上传文件截断上传条件竞争文件上传靶场搭建 参考文章https://juejin.cn/post/7068931744547733517出现个小问题&#xff0c;我的端口冲突了&#xff0c;所以换了一个…

Linux-unbuntu修改apt源

本文介绍如何将ubuntu的apt源修改为清华大学的镜像源 主要是修改/etc/apt/source.list的文件&#xff0c;并且使用sudo apt-get update来刷新源 修改apt源 unbuntu安装好之后&#xff0c;apt的源是us的&#xff0c;这样下载速度比较慢 apt源的地址放在/etc/apt/source.list中…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.14 ES 索引操作

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.14 ES 索引操作4.14.1 索引操作4.14.2 小结4 数据…

m基于OFDM数字电视地面广播系统中频域同步技术研究

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 OFDM技术的基本构架如下所示&#xff1a; 注意系统中的虚线部分就是你要做的OFDM的频域同步模块。我们的MATLAB代码就是参考这个系统结构进行设计的。其中虚线就是本课题要做的代码部分…

[附源码]java毕业设计停车场管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

day04 spring 声明式事务

day04 spring 声明式事务 1.JDBCTemplate 1.1 简介 为了在特定领域帮助我们简化代码&#xff0c;Spring 封装了很多 『Template』形式的模板类。例如&#xff1a;RedisTemplate、RestTemplate 等等&#xff0c;包括我们今天要学习的 JDBCTemplate。 1.2 准备工作 1.2.1 加…