TS 入门指南

news2024/11/15 7:09:43

TS 类型基本用法

TS简介

  • TypeScript,简称 TS, 是一种由微软开发的编程语言,它是对 JavaScript 的一个增强
  • 让我们更加方便地进行类型检查和代码重构,提高代码的可靠性和可维护性
  • 同时,TypeScript 还支持 ECMAScript 的最新特性

搭建学习环境 

进入 Node 官网安装

安装完成后使用以下命令查看是否安装完成: 安装完成后使用以下命令查看是否安装完成: 

  • node -v
  • npm -v

继续安装 nrm 管理包源:

  • npm i nrm -g
  • nrm ls
  • nrm use taobao

全局安装 typescript:

  • npm i typescript -g

全局安装 ts 的编译工具,使用 ts-node 可以将 ts 文件执行

  • npm i ts-node -g
    • 使用:ts-node index.ts
  • 安装 ts-node 依赖包:npm install tslib @types/node -g

使用 TS 可以有良好的提示,使代码可读性变强,更提前发现问题

TS 类型

  • TS 出现弥补的 JS 的类型缺失
  • 众所周知,代码错误越早发现越好,代码编写 > 代码编译 > 代码运行 开发 > 测试 > 上线
  • Vue2 使用 Flow 进行类型检查,后续 Vue3 也使用 Typescript 重写
  • TS 代码要运行在浏览器,需要进行类型擦除,转换为 JS 代码
  • TS 类型包含所有 JS 类型 null、undefined、string、number、boolean、bigInt、Symbol、object(数组,对象,函数,日期)
  • 还包含 void、never、enum、unknown、any 以及 自定义的 type 和 interface

变量声明

  • var/let/const 标识符: 数据类型 = 赋值

手动指定数据的类型(类型注解),不要写成大写的 String ,因为这是 JS 的一个内置类

const data: string = 'hello'

型定义的时候已经决定

类型推导

  • 如果没有明确指定类型,TS 会隐式的推导出一个类型
  • 这类型根据赋值的类型推断,没有赋值则为 any 类型,能自动推导出类型,没必要手动指定

 基础类型

 

数组和元组 

Array<元素类型>这种写法可能会存在与jsx冲突问题
const arr1: Array<number> = [1, 2, 3]
元素类型后面接上[],表示由此类型元素组成的一个数组
[const arr2: number[] = [1, 2, 3]
数组里面可能有字符串和数组
const arr3: (string | number)[] =
[1,2,'黛玉']
//元组已知元素数量和类型的数组,元组一定要指明类型
const tuple:[string, number] = ['云牧', 18]

  • tuple可以作为函数返回的值,React 的 useState 就是个元组,类似于
function useState<T>(state: T): [T, (newState: T)=> void]
let currentState = state
const changeState = newState
currentState = newState
}
return [currentState, changeState]
[const [count, setCount]= useState(10)

对象类型

  • TS 中的 object 类型泛指所有的的非原始类型,如对象、数组、函数
  • 下面我们使用 object 声明了这个对象,但是这个对象既不能设置新数据,也不能修改老数据
const obj: object = {
name:'云牧',
}
obj.age = 18
obj.name='黛玉'

  • 下面这种对象类型的限制才更为精确
  • 可限制对象每个属性的类型
const p1:{name: string; age:number } = { name:'黛玉',age:18}
// 问号,代表某个属性可选,不一定需要
const p2: { name: string; age?: number } = {I name:'云牧'}

any、unknown、never

  • 无法确定一个变量的类型,可使用 any,此时在其身上做任何操作都是合法的,即使访问了一个不存在的属性
  • 如果某些情况处理类型过于繁琐,或者在引入一些第三方库时,缺失了类型注解,这个时候 我们可以使用 any,更多是为了兼容老代码
function anyType(msg: any) {
console.log(msg)
}

  • unknown 类型表示一个值可以是任何类型,它是所有类型的父类型,任何类型都可以赋值给 unknown 类型,但是 unknown 类型只能赋值给 any 类型和 unknown 类型本身
  • 类似 any,与 any 类型不同的是,unknown 类型的变量不能直接赋值给其他类型的变量,也不能调用其上的任何方法或属性,除非先进行类型检查或类型断言,这样确保运行时的类型安全
  • 默认在其操作都是不合法的,主要是在编写通用代码时,例如编写库或框架时,需要处理来自不同来源的数据,但又不确定数据的类型
//类型判断后才能使用 unknown类型数据
function foo(arg: unknown) {
  if (typeof arg == 'string') {
     console.log(arg.toUpperCase())
   } else if (typeof arg == 'number') {
     console.log(arg.toFixed(2))
  }
}
//类型断言后使用
function bar(arg: unknown) {
  const num = arg as number
  console.log(num.toFixed(2))
}

  • 假如一个函数的返回结果是死循环或者异常,我们可以使用 never 类型表示这种永不存在值的类型
  • 它是一个底层类型,不是任何类型的子类型,也没有任何子类型
  • 更多情况是封装工具库时候可以使用,比如下面这段代码,如果单纯在函数参数的类型多加一个参数,而没有对应 case 处理,则会报错
function handleMsg(msg: string | number) {
switch (typeof msg) {
case 'string
break
}
case 'number':
break
default: {
const check: never = msg
}
handleMsg('hello')
handleMsg(10)

 never 会在联合类型被直接移除

函数类型

  • 声明函数时,可以在每个参数后添加类型注解,声明其参数类型
  • 同样也可以声明返回值的类型,不过也可以不写让 TS 自动推导
  • 函数参数的一般顺序 必传参数 - 有默认值的参数 - 可选参数

 

枚举类型

  • 枚举类型将一组可能出现的值,一个个列举,定义在一个类型中,这个类型就是枚举

 

这种字符串的枚举可能使用 type Direction = 'LEFT' | 'RIGHT' | 'TOP' | 'RIGHT'可能会更好点 

type Direction = 'LEFT'|'RIGHT'|'TOP'|'BOTTOM'
function turnDirection(direction: Direction) {} 
turnDirection('LEFT')

interface 和 type

基本使用

  • 使用 interface 定义接口,使用 type 定义类型别名
  • 都可以约束对象的结构
// 方式一:使用interface
interface IPoint{
 x: number
 readonly y: number // readonly代表只读
 z?:number //?代表可选
}
// 方式二:使用type
type Point = {
  X: number
  y: number
}

区别

  1. interface 只描述对象,type 则可以描述所有数据
  2. interface 使用 extends 来实现继承,type 使用 & 来实现交叉类型
  3. interface 会创建新的类型名,type 只是创建类型别名,并没有创建新类型
  4. interface 可以重复声明扩展,type 则不行(别名是不能重复的)

 索引签名(Index Signatures)

接口继承

  • 接口和类继承相同,都是使用 extends 关键字
  • 接口是支持多继承的(类不支持多继承)

interface Animal {
 running: () => void
}
interface Person{
 name: string
 age: number
}
//自动扩展 Person类型
interface Person {
 sex: string
}

// 手动使用 extends 继承
interface Student extends Person, Animal {
  id: number
}
const u: Student = { name:'云牧',age:18, sex: 'male', id: 1, running() }

接口实现

  • 定义的接口可以被类实现
  • 之后如果需要传入接口的地方,同样也可以将类实例传入
  • 这就是面向接口开发

interface IRun {
 running: () => void
}
interface IEating {
 eating:() => void
}
class Person implements IRun, IEating {
running(){}
eating(){}
}
function run(runner: IRun) {
  runner.running()
}
constp = new Person()
run(p)

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

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

相关文章

对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中的所有值为x的数据元素

对长度为n的顺序表L&#xff0c;编写一个时间复杂度为O(n)&#xff0c;空间复杂度为O(1)的算法&#xff0c;该算法删除线性表中的所有值为x的数据元素 算法思路&#xff1a; 用count标记遇到x的次数&#xff0c;每次遇到x&#xff0c;count 遇到非x的元素&#xff0c;把它前移…

探索企业基本信息查询API:数据访问的便捷方式

前言 当涉及到获取企业的基本信息时&#xff0c;传统的方法往往需要大量的时间和人力资源&#xff0c;以收集、整理和验证数据。然而&#xff0c;现在有一种便捷的方式可以解决这个问题&#xff0c;那就是通过企业基本信息查询API。本文将探讨这种API是如何成为数据访问的便捷…

【Hive SQL】字符串操作函数你真的会用吗?

文章目录 ININSTRSUBSTRLOCATELIKE 前言&#xff1a; 今天在做一个需求的时候&#xff0c;需要判断字符串中是否包含一个子串&#xff0c;然后我发现了我平常没注意到的一个点&#xff0c;通过这篇博文来记录一下。 IN IN 函数用于判断一个元素是否存在于所给的元素组中&…

【基础架构设计】仿12306系统公共组件设计深度解析

仿12306系统学习 学习路线 12306 铁路购票系统学习总体分为三块&#xff1a;组件库开发、业务梳理以及业务系统开发。 组件库开发 组件库的产出源于对公共功能的封装&#xff0c;避免了在不同项目之间相互复制代码的情况。当然&#xff0c;如果这种复制代码的方式出现问题&a…

红酒种类及更多的红酒基本知识

从法国不拘一格的绿色牧场到北加州的金山&#xff0c;各种不同类型的红葡萄酒从淡色到豪放&#xff0c;从各种不同的种植地区走向世界各地的餐桌。来自云仓酒庄品牌雷盛红酒分享红葡萄酒在味道、酒体、颜色、香味以及它们提供的整体体验方面可以有很大的不同。 为合适的场合选…

amr文件苹果手机怎么打开?四个方法教会你!

Amr格式文件因其资源占用率低、传输方便&#xff0c;通常用作各大手机厂商广泛使用的一种保存录音文件的格式&#xff0c;非常适合制作来电铃声。但是amr音频格式的适用范围有限&#xff0c;很多时候就需要把amr转换成兼容性更好的mp3格式。如何将AMR文件转换为mp3然后在苹果手…

Linux 内核文件系统dentry_path_raw函数

文章目录 一、简介1.1 __dentry_path1.2 prepend_name1.3 d_path 二、dmeo参考资料 一、简介 // linux-5.4.18/fs/d_path.cchar *dentry_path_raw(struct dentry *dentry, char *buf, int buflen) {return __dentry_path(dentry, buf, buflen); } EXPORT_SYMBOL(dentry_path_r…

语雀停服8小时,P0级事故,故障原因和补偿来了。

昨天互联网圈子里发生了一件大事&#xff0c;那就是语雀的 P0 级事故&#xff0c;前后足足停服了 7 个多小时&#xff0c;放眼整个互联网的发展史&#xff0c;都是相当炸裂的表现。 语雀是技术大牛玉伯在蚂蚁金服内部孵化出来的一个云端知识库&#xff0c;整体的界面非常清爽&…

[SQL开发笔记]IN操作符: 在WHERE子句中规定多个值

上一实例我们在where子句使用(year2022 or year2020)&#xff0c;如果我们需要在WHERE子句中规定多个值呢&#xff1f;这时我们将学习IN操作符 一、功能描述&#xff1a; 在WHERE子句中规定多个值。 二、IN操作符语法详解&#xff1a; IN操作符语法&#xff1a; SELECT col…

【Linux】MAC帧协议 + ARP协议

文章目录 &#x1f4d6; 前言1. 数据链路层2. MAC帧格式3. 再谈局域网4. ARP协议4.1 路由器的转发过程&#xff1a;4.2 ARP协议格式&#xff1a; 5. 如何获得目的MAC地址 &#x1f4d6; 前言 在学完网络层IP协议之后&#xff0c;本章我们将继续向下沉一层&#xff0c;进入到数…

STM32-通用定时器

通用定时器 通用定时器由一个可编程预分频器驱动的16位自动重新加载计数器组成。应用&#xff1a;测量输入的脉冲长度信号&#xff08;输入捕获&#xff09;、产生输出波形&#xff08;输出比较和PWM&#xff09;。 脉冲长度和波形周期可以从几微秒调制到几毫秒&#xff0c;使用…

记录隐藏挖矿木马rcu_tasked的查杀

记录一次项目中挖矿病毒的经历 这是黑客使用的批量蔓延病毒的工具&#xff0c;通过如下脚本 [rootServer .cfg]# cat /home/pischi/.bash_history cd /root/ nvidia-smi;ls -a;cd .cfg;ls -a;wc -l ip ./key 20 -f ip pass 22 "nproc;nvidia-smi;rm -rf .cfg;mkdir .cfg…

怎么做好网络软文推广?媒介盒子为你揭秘

不管是初创公司还是成熟公司&#xff0c;都需要打响品牌知名度&#xff0c;而有些公司在网络推广中的预算不是很高&#xff0c;这个时候就可以利用软文进行推广&#xff0c;今天媒介盒子就来告诉大家&#xff0c;如何写好网络推广软文。 一、 明确推广目标 确定推广目标有助于…

【备考网络工程师】如何备考2023年网络工程师之常见考点篇(1)

文章目录 写在前面涉及知识点1、NSLOOKUP命令设置的几个类型&#xff08;DNS服务器资源记录类型&#xff09;2、结构化综合布线系统的组成3、xDSL及相关概念4、私有地址及A-E类地址4.1 、私有地址4.2 、A-E类地址 总结 写在前面 其实做模拟或真题时候&#xff0c;总是会在关键…

建联合作1000+达人,如何高效管理?

随着社交媒体的发展&#xff0c;达人营销已成为品牌营销重要的方式之一&#xff0c;甚至可以说是必选项。 对于很多品牌商家来说&#xff0c;一次合作几百个不同类型、不同社媒平台的达人&#xff0c;已屡见不鲜。在电商大促前、主推单品爆品时&#xff0c;同时合作上千个达人&…

通过js来实现用身份证号来判断性别和出生年月

html: <input type"text" id"shenfenzhenghao" oninput"hao()" placeholder"证件号"><input type"text" id"xingbie" disabled"disabled" placeholder"性别"><input type&qu…

CVPR 2024 延期!

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【计算机视觉和Transformer】交流群 扫码加入CVer知识星球&#xff0c;可以最快学习到最新顶会顶刊上的论文idea和CV从入门到精通资料&#xff0c;以及最前沿项目和应用&…

『第五章』二见痴心:初识小雨燕(中)

在本篇博文中,您将学到如下内容: 7. 值类型与引用类型8. OOP与POP9. 协议与扩展10. 函数与闭包11. 泛型和宏总结相逢情便深,恨不相逢早 玲珑骰子安红豆,入骨相思知不知。 7. 值类型与引用类型 在 Swift 中我们可以将之前介绍的那些数据类型分为两大类:值类型和引用类型。 …

做好微信私域,一定要知道的5大触点

越来越多人意识到私域的重要性&#xff0c;也有越来越多人在私域中获益。 把用户私有化&#xff0c;只是第一步。 我们还要和用户建立联系&#xff0c;要一直互动。 也就是说&#xff0c;我们必须高频地和用户互动&#xff0c;要不断去触达他们。而触达&#xff0c;就需要触点。…

科大讯飞发布讯飞星火 3.0;开源AI的现状

&#x1f680; 科大讯飞发布讯飞星火 3.0&#xff0c;综合能力超越ChatGPT&#xff08;非GPT-4版&#xff09; 摘要&#xff1a;科大讯飞在2023全球1024开发者节上宣布讯飞星火 3.0正式发布&#xff0c;号称综合能力已超越ChatGPT。据介绍&#xff0c;星火认知大模型 V3.0在文…