TypeScript核心类型概览与应用-1

文章目录

  • TypeScript入门
    • 1.TypeScript介绍
    • 2.编译并运行TS代码
      • 2.1.简化运行ts步骤
    • 3.TS中的常用类型
      • 3.1.TS中的类型注解
      • 3.2.TS中的原始类型
      • 3.3.TS中的数组类型
      • 3.4.TS中的联合类型
      • 3.5.类型别名
      • 3.6.函数类型
        • 3.6.1.单独执行参数、返回值类型
        • 3.6.2.同时指定参数,返回值类型
        • 3.6.3.函数的void类型
        • 3.6.4.函数可选参数*
      • 3.7.TS中的对象类型

TypeScript入门

1.TypeScript介绍

TypeScript 是一种由微软开发的开源编程语言,它是JavaScript的一个超集,也就是说任何有效的JavaScript代码也是有效的TypeScript代码。TypeScript在JavaScript的基础上添加了静态类型定义、类、接口、命名空间等特性,旨在解决JavaScript在大型应用开发中遇到的可维护性、可扩展性和编译时错误检查等问题。

TypeScript简介

  • 静态类型检查:TypeScript 引入了静态类型系统,允许开发者在编码阶段就发现类型错误,而不是等到运行时。这有助于提高代码质量和开发效率,减少因类型不匹配导致的错误。
  • 类和接口:提供了面向对象编程的特性,如类(class)、继承、接口(interface)等,使得代码结构更清晰,易于复用和维护。
  • 强大的IDE支持:由于类型信息的存在,IDE和编辑器(如Visual Studio Code)能够提供智能感知、自动完成、接口提示等高级功能,极大提升开发体验。
  • 兼容JavaScript:TypeScript被编译成纯JavaScript代码,因此可以无缝集成到现有的JavaScript项目中,同时也能利用现有的JavaScript库和框架。
  • 模块化:支持ES6模块化,有助于组织大型代码库,提高代码的可维护性和可重用性。

相比JavaScript的优势

  1. 类型安全:静态类型检查可以提前捕捉到很多潜在错误,避免了在运行时因为变量类型问题引发的异常,提高了程序的健壮性。
  2. 更好的开发工具支持:由于类型信息的存在,编辑器和IDE能提供更加精准的代码补全、接口文档提示、重构支持等,提升了开发效率。
  3. 易于维护和协作:随着项目规模的扩大,清晰的类型定义和面向对象的特性让代码更加结构化,便于团队成员理解和维护。
  4. 长期可维护性:类型注解作为代码的一部分,形成了“代码的文档”,有助于新加入项目的开发者更快地理解代码结构和意图。
  5. 准备未来:TypeScript支持并鼓励使用ES6及以后的新特性,即使当前环境不支持这些特性,TypeScript也能将其编译为向后兼容的JavaScript代码,帮助开发者过渡到未来的JavaScript标准。

2.编译并运行TS代码

  1. 创建hello.ts文件

    1. const info : string = 'hello ts';console.log(info)
  2. 将TS文件编译为JS文件,在终端中输入命令 tsc .\hello.ts (此时该目录下会生成一个同名的JS文件)

    1. image-20240506074107694
  3. 执行JS代码,在终端中输入命令 node hello.js (即可执行刚刚的js文件)

    1. image-20240506074126859

需要注意的是,TS编译生成的JS文件中,代码中就没有类型的信息了。

image-20240506074614754

2.1.简化运行ts步骤

简化方式 通过ts-node包,可以直接在node中运行ts代码,不用每次再使用ts进行编译 在使用node进行运行

npm i -g ts-node# 使用 就可以实现编译运行两步操作
# 注意 ts-node 并没有生成js文件,他在内部偷偷帮你转换,并且运行
ts-node hello.ts 

image-20240506075012630

3.TS中的常用类型

在TypeScript(TS)中,类型系统是其核心特性之一,为JavaScript增添了静态类型检查的能力,从而提高代码的可维护性和安全性。

也可以将TS中测常用基础类型细分为两类:

  1. JS已有类型
    • 原始类型:number/string/boolean/null/undefined/symbol
    • 对象类型:object(包括 数组、对象、函数等对象)
  2. TS新增类型
    • 联合类型、自定义类型、接口、元组、字面量类型、枚举、void、any等

以下是TypeScript中一些常用且重要的类型:

  1. 基本类型

    • string:用于文本字符串。
    • number:用于数值,包括整数和浮点数。
    • boolean:布尔值,只能是truefalse
    • nullundefined:表示空值或未定义的值,TypeScript 中它们是所有类型的子类型。
    • void:表示没有任何返回值的函数。
    • never:表示永远不会出现的值的类型,常用于抛出异常或无限循环的函数。
  2. 数组类型

    • 使用Array<元素类型>元素类型[]定义,例如number[]表示一个数字数组。
  3. 元组(Tuple)

    • 定义固定长度和类型的数组,例如[string, number]表示一个数组,其第一个元素为字符串,第二个元素为数字。
  4. 对象类型(Object)

    使用接口(interface)或类型别名(type)来描述对象结构,如:

    interface Person {name: string;age: number;
    }
    
  5. 枚举(Enum)

    • 用于定义一组命名的常量,如:

      1enum Color {Red, Green, Blue}
      
  6. 任意类型(any)

    • 表示可以是任何类型,使用时需谨慎,因为它绕过了类型检查。
  7. 联合类型(Union Types)

    • 使用管道符号|分隔,表示一个值可以是多种类型中的一种,如string | number
  8. 类型断言(Type Assertion)

    • 用来告诉编译器某个值的类型,形式为value as Type
  9. 字面量类型(Literal Types)

    • 直接使用具体的值作为类型,如const answer: 42 = 42;
  10. 索引签名(Index Signatures)

    • 用于定义对象中动态属性的类型,如{ [key: string]: any }
  11. 类(Class)和接口

    • 类用于创建对象的蓝图,接口用于定义类或对象的形状。
  12. 泛型(Generics)

    • 提供了编写可重用组件的方式,这些组件可在多种数据类型上工作,如Array<T>

3.1.TS中的类型注解

示例代码:

// 只需要在 变量后面 : 具体的类型 即可
let age : number = 19

代码中的 number 类型就是类型的注解,作用就是为变量添加类型约束,比如上面为age类型添加了 number类型的约束(数值类型),一旦约定了什么类型,就只能给变量赋值什么类型,否则就会报错

image-20240531072116574

3.2.TS中的原始类型

原始类型:number/string/boolean/null/undefined/symbol

这些类型,完全按照JS中类型的名称来书写即可,非常简单。

/* number/string/boolean/null/undefined/symbol */
let age : number = 30
let username : string = '张三'
let isRunning : boolean = trueconsole.log("年龄:",age)
console.log("姓名:",username)
console.log("是否在奔跑:",isRunning)

image-20240531073429887

3.3.TS中的数组类型

对象类型:object(包括,数组、对象、函数等对象)。

对象类型在TS中更加细化,每个具体的对象都有自己类型的语法

数组类型的写法

推荐使用 number[] 这种写法

let numbers : number[] = [1,3,3,4,5,6,7,8,9,10]
let strings : Array<string> = ['1','2','3','4','5','6','7','8','9','10']console.log(numbers)
console.log(strings)

image-20240531074236549

3.4.TS中的联合类型

当数组中既有number类型又有string类型,这个数组的类型该如何书写的?

如果数组中既有number类型 又有string类型,这时候需要使用 | ts中的联合类型(由两个或者多个类型组成类型,表示可以是这些类型中的任意一种),主要这里只是 | 一个竖线,不是两个 两个 || 是逻辑表达式

let listInfo : (string | number | boolean)[] = ['1',2,'3',4,true]// 打印当前集合数据 以及类型
listInfo.forEach(item=>{console.log(item + '\t\t' + typeof(item))
})

3.5.类型别名

类型别名(自定义类型):为任意类型起别名

当一个类型(复杂)并且多次被使用时,可以通过类型别名,简化该类型的使用。

// 类型别名
type CustomArray = (number | string | boolean)[]let user1 : CustomArray = ['张三',21,true]user1.forEach(item=>{console.log(item +"\t" + typeof(item))
})

image-20240603072454983

image-20240603072557432

  1. 使用 type 关键字来创建类型的别名。
  2. 类型别名,可以是任意合法的变量名称
  3. 创建类型别名后,直接使用该类型别名作为变量的类型注解即可。

3.6.函数类型

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

为函数指定类型的两种方式

  1. 单独指定参数、返回值类型。
  2. 同时执行参数、返回值类型。
3.6.1.单独执行参数、返回值类型
// 函数表达式形式
const add = (num1: number, num2: number): number => {return num1 + num2;
}
const res = add(1, 2)
console.log("最终计算结果:" + res + '\t' + typeof (res) + '\t')

image-20240603074952858

image-20240603074402983

3.6.2.同时指定参数,返回值类型

image-20240603075950927

const addNum : (num1:number, num2:number)=> number = (num1,num2)=>{return num1 + num2;
}
const res = addNum(1,3)console.log("最终计算结果:" + res + '\t' + typeof (res) + '\t')

当函数作为表达式时,可以通过 类似箭头函数形式的语法 来为函数添加类型

注意:这种形式只适用于函数表达式

image-20240603075557515

3.6.3.函数的void类型

如果函数没有返回值,那么函数的返回值类型就为🐤 void

image-20240603081000146

const getUserName = (name: string): void => {console.log(name)
}
getUserName('迪加!')

image-20240603080852241

3.6.4.函数可选参数*

当使用函数实现某个功能时,参数可以传,也可以不传。这种情况下,在给函数参数指定类型时,就用到可选参数了。

比如数组中的 slice方法 可以使用 slice() 也可以使用 slice(1) 也可以使用 slice(1,3)

const mySlice = (start?: number, end?: number): void => {console.log("起始索引:" + start + "\t" + "结束索引:" + end)
}// 使用了可选参数,那么我们自定义的 mySlice()中的参数  可以传 也可以不传了
mySlice()
mySlice(1)
mySlice(1, 3)

image-20240603083421794

可选参数:在可传 可不传的参数后面添加?(问号)

注意:可选参数只能出现在参数列表的最后,可选参数后面不能再出现参数

3.7.TS中的对象类型

JS中的对象是由属性和方法构成的,而TS中对象的类型就是在描述对象的结构(有什么属性 和 方法)

对象类型的写法:

// 单行形式
let person2: { name: string; age: number; show(): void; } =
{name: '张三',age: 19,show() {console.log('你好,我是' + this.name + '\t' + '我今年' + this.age + '岁了');}
}
// 多行形式
let person: {name: string,age: number,show(): void
}= {name: '张三',age: 19,show() {console.log('你好,我是' + this.name + '\t' + '我今年' + this.age + '岁了');}
}person.show()
  1. 直接使用{}来描述对象结构,属性采用 属性名:类型 的形式,方法采用 方法名():返回值类型 的形式
  2. 如果方法有参数,就在方法名称后面的小括号中指定类型参数 例如show(name:string):void
  3. 在一行代码中指定对象的多个属性类型时,使用;(分号)来分隔
    1. 如果一行代码只能指定一个属性类型,(通过换行来分割多个属性类型,可以去掉 ;(分号)
    2. 方法的类型可以使用箭头函数的形式(比如{show:()=>void}

image-20240604065526304

TS对象中的可选属性

对象的属性或者方法也是可选的,此时就需要用到可选属性

比如我们在使用axios({ … })时,如果发送GET请求,mothod属性就可以省略

// 如果我们不传methods 那么默认的请求方式就是get
// 可选属性的语法 与 函数的可选参数语法一直 使用 ? 来表示
const myAxios = (config: { url: string, method?: string }): void => {console.log(config);
}myAxios({ url: "http://localhost:9000/api/v1/test" })
myAxios({ url: "http://localhost:9000/api/v1/test", method: 'POST' })

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

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

相关文章

OpenGL系列(四)Shader

通过VBO和VAO准备好数据后&#xff0c;接下来要指示GPU如何通过这些数据绘制图形。类似CPU可以通过执行程序来完成特定的任务&#xff0c;GPU也可以执行特定的程序来完成绘制任务&#xff0c;GPU执行的程序称为Shader&#xff0c;也叫着色器。 GPU绘制图形分为不同的处理阶段&a…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑发用电相似性的海上风电中长期双边协商交易优化决策模》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

小鸡庄园智慧农场养殖游戏开发:科技与农业的完美结合

随着科技的进步&#xff0c;一种全新的游戏模式——智慧农场养殖游戏&#xff0c;正在逐渐崭露头角。本文将深入探讨小鸡庄园智慧农场养殖游戏的开发背景、特点、技术实现方式以及未来的发展趋势&#xff0c;以期为游戏产业创新和农业现代化提供新的思路和启示。 一、开发背景…

Rust 性能分析

都说Rust性能好,但是也得代码写得好,猜猜下面两个代码哪个快 . - 力扣&#xff08;LeetCode&#xff09; use std::collections::HashMap; use lazy_static::lazy_static;lazy_static! {static ref DIGIT: HashMap<char, usize> {let mut m HashMap::new();for c in …

【Nacos】docker-compose启动nacos v2.2.3,启动时修改默认密码不使用naocs

1. 背景 出于安全考虑&#xff0c;我司DevOps平台自动部署的容器化nacos密码不能是弱密码或默认值 但是nacos-v2.2.3官方镜像启动后会初始化nacos用户密码为nacos&#xff0c;修改启动时的变量并没有生效。 2. 部署验证 2.1 yml文件如下 注意将derby库的初始化文件挂载出来…

Python | Leetcode Python题解之第129题求根节点到叶节点数字之和

题目&#xff1a; 题解&#xff1a; class Solution:def sumNumbers(self, root: TreeNode) -> int:if not root:return 0total 0nodeQueue collections.deque([root])numQueue collections.deque([root.val])while nodeQueue:node nodeQueue.popleft()num numQueue.p…

产品人生(9):从“波士顿矩阵”看“个人职业规划”

波士顿矩阵&#xff08;简称BCG矩阵&#xff09;是一种战略规划工具&#xff0c;由波士顿咨询公司的创始人布鲁斯亨德森&#xff08;Bruce Henderson&#xff09;于1970年代初提出的&#xff0c;它以两个关键指标作为分析维度&#xff1a;市场增长率和相对市场份额&#xff0c;…

探索k8s集群的配置资源(secret和configmap)

目录 ConfigMap ConfigMap&#xff08;主要是将配置目录或者文件挂载到k8s里面使用&#xff09; 与Secret类似&#xff0c;区别在于ConfigMap保存的是不需要加密配置的信息。&#xff08;例如&#xff1a;配置文件&#xff09; ConfigMap 功能在 Kubernetes1.2 版本中引入&…

过期视频怎么恢复?如何从手机、电脑和其他设备中恢复?

过期视频是指那些被误删、丢失或因系统升级等原因而无法正常访问的视频文件。这些视频可能包含了我们珍贵的回忆、重要的信息或者具有商业价值的内容。过期视频的恢复可以帮助我们找回失去的数据&#xff0c;减少损失&#xff0c;提高工作效率和生活质量。过期视频怎么恢复&…

Android WebView上传文件/自定义弹窗技术,附件的解决方案

安卓内核开发 其实是Android的webview默认是不支持<input type"file"/>文件上传的。现在的前端页面需要处理的是&#xff1a; 权限 文件路径AndroidManifest.xml <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&g…

【AI基础】第二步:安装AI运行环境

开局一张图&#xff1a; 接下来按照从下往上的顺序来安装部署。 规则1 注意每个层级的安装版本&#xff0c;上层的版本由下层版本决定 比如CUDA的版本&#xff0c;需要看显卡安装了什么版本的驱动&#xff0c;然后CUDA的版本不能高于这个驱动的版本。 这个比较好理解&#xff…

毕业论文word常见问题

0、前言&#xff1a; 这里的问题都是以office办公软件当中的word为例&#xff0c;和WPS没有关系。 1、页眉横线删不掉&#xff1a; 解决方案&#xff1a;进入页眉编辑状态&#xff0c;在开始选项栏中选择页眉字体样式&#xff0c;清除格式。 修改方式如下&#xff1a; 2、…

Linux——简单指令汇总

Linux&#xff0c;一般指GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到Minix和Unix思想的启发&#xff0c;是一个…

C++ | Leetcode C++题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; class Solution { public:const int dx[4] {1, -1, 0, 0};const int dy[4] {0, 0, 1, -1};void solve(vector<vector<char>>& board) {int n board.size();if (n 0) {return;}int m board[0].size();queue<pair<…

C++类的继承与派生概念

派生和继承是自然界普遍存在的一种现象。例如&#xff0c;“猫”和“白猫”。当人们谈及“猫”时&#xff0c;知道它有4条腿&#xff0c;1条尾巴&#xff0c;抓老鼠,为哺乳动物。如谈论“白猫”时&#xff0c;它也是猫&#xff0c;只不过增加了一个新的特征&#xff0c;即它的毛…

Redis缓存(笔记二:Redis常用五大数据类型)

目录 1、Redis中String字符串 1.1 常用命令解释&#xff1a; 1.2 原子性 1.3 具有原子性的常用命令 1.4 String数据结构 1、Redis中String字符串 概念 String 是 Redis 最基本的类型&#xff0c;可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key对应一个 value…

第100天:权限提升-数据库RedisPostgre第三方软件TV向日葵服务类

目录 思维导图 案例一: 数据库-Redis 数据库权限提升-计划任务 案例二: 数据库-PostgreSQL 数据库权限提升-漏洞 PostgreSQL 提权漏洞&#xff08;CVE-2018-1058&#xff09; PostgreSQL 高权限命令执行漏洞&#xff08;CVE-2019-9193&#xff09; 案例三: 三方应用-…

【数据结构与算法 经典例题】(C语言)反转链表图文详解

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 ​ 目录 一、问题描述 二、解题思路分析 三、代码实现 一、问题描述 二、解题…

uniapp使用uQRCode页面不显示也不报错

我使用的版本是&#xff1a;4.0.6 引入到项目中后根据官方的配置教程进行配置&#xff1a; 但是页面上就是不显示&#xff0c;也不报错&#xff0c;看官网发现步骤也没问题 解决方法&#xff1a; 这句话代表的是uQrcode会被自动引用注册&#xff0c;但是你引过组件库或者别的…

QT treeWidget如何添加虚线

1、添加以下代码即可&#xff1a; ui.treeWidget->setStyle(QStyleFactory::create("windows"));2、效果如下&#xff1a;