36.JavaScript补完计划:typescript

点赞收藏加关注,你也能住大别墅!

一、什么是typescript

在这里插入图片描述

二、应用场景

我认为JavaScript的特点就是在于它强大的延展性,不仅蔓延到了后端,而且也逐渐成为代码世界无法被忽视的存在。那么,编写js代码时我们都会经常遇到数据类型无法锁定,或者即使锁定也需要编写冗长的判断逻辑,例如:函数参数的类型规范(这里就不展开了)。TypeScript的诞生就解决了这个问题,我称之为js的补完计划。当然,最终ts会被编译为js,但是用ts进行开发,你会体验到一种安心和踏实的感觉,温馨的提示会恰到好处地出现在你需要它的地方。

三、如何使用?

在这里插入图片描述

四、基本语法

(一)ts中的静态类型、类型注解、类型推断、基础类型、对象类型
// 一、ts的静态类型
const year: number = 2013//Point类中的静态类型约束了变量point的定义
interface Point {x: numbery: number
}
const point: Point = {x: 3,y: 4,
}//Point2类中的静态类型约束了变量point2的定义
interface Point2 {x: 1y: 2
}
const point2 = {x: 'yi',y: 'er',
}// -----------------------------------------------------
// 二、类型注解、类型推断
//1.注解
let count: number
count = 123
//2.推断
let count2 = 123// -----------------------------------------------------
// 三、ts中的基础类型,对象类型
// 1.基础 :number, string, boolean, null, undefined, symbol, void// 2.对象:Object, [], function, 类
// (1)一般函数
// function add(形参1:number,形参2:number,...):返回值类型number等 {
//   return num1+num2;
// }
function add(num1: number, num2: number): number {return num1 + num2
}
// (2)无返回值函数
function testVoid(): void {console.log('没有返回值')
}
// (3)never
function haha(): never {while (true) {}
}
// (4)解构
function jiegou({ num1, num2 }: { num1: number; num2: number }): number {return num1 + num2
}
const res = jiegou({ num1: 1, num2: 2 })
// (5)箭头函数
const func = (str: string): string => {return str
}
// ---------------------------------------------------------------
// (6)数组
const arr: number[] = [1, 2, 3]
const mixarr: (number | string)[] = [1, '2', 3]
const objarr: { name: string }[] = [{ name: 'ts' }]
// 类型别名
type User = { name: string }
const objarr2: User[] = [{ name: 'ts' }]class User3 {name: stringage: number
}
const objarr3: User3[] = [{ name: 'ts', age: 9 }]
// ---------------------------------------------------------------
// (7)元组
// 当需要按固定长度、固定数据类型来约束数组中数据类型的时候需要使用元组
const useInfo: [string, number] = ['ts', 9]
// csv
const csvarr: [string, number][] = [['js', 9],['ts', 10],
]
// (8)json
interface Person {name: string
}
const jsonstr = '{"name":"ts"}'
const newname: Person = JSON.parse(jsonstr)//(9)类型不确定
let msg: number | string = 123
msg = '123'
(二)ts中的接口
//接口interface
interface Person {// readonly stname:string; readonly 表示不能修改这个属性,只可以读取属性值stname: stringage?: number // ?表示age属性可有可无//[propName:string]:any 当实例中可能含有未约束的属性时,可以增加这样一行代码say(): string
}const getPersonName = (person: Person): void => {console.log(person.stname)
}const setPersonName = (person: Person, stname: string): void => {person.stname = stname
}const person = {stname: 'js',sex: 1,say() {return 'hello'},
}getPersonName(person)
// getPersonName({
//   stname: 'js',
//   sex:1
// })------------------------直接传字面量会触发ts的强校验,所以这样写会报错,可以在类中定义[propName:string]:any来解决setPersonName(person, 'ts')
// ---------------------------------------------------
// 类 class
class User implements Person {stname = 'dell'say() {return 'hellp'}
}
// 继承
interface Teacher extends Person {teach(): string
}
const person2 = {stname: 'js',sex: 1,say() {return 'hello'},// 父接口中并未定义teach(),但是,子接口中定义了,那么这个数据不仅要符合父接口,也要符合子接口teach() {return 'teach'},
}
//继承的接口 = 子 + 父 中定义的属性和方法
const getPersonName2 = (person: Teacher): void => {console.log(person.stname)
}
getPersonName2(person2)//--------------------------------------------
// 接口定义函数
interface Fun {(msg: string): string
}const tsfun: Fun = (msg) => {return 'this is Fun'
}
(三)ts中的类
// 类的定义和继承
class Star {name = 'star'getName() {return this.name}
}
class Moon extends Star {getMoonName() {return 'moon'}
}
const star = new Star()
const moon = new Moon()
console.log(star.getName())
console.log(moon.getMoonName())// 重写
class Mars extends Star {//重写了父类的getName方法getName() {return 'Mars'}
}// 字类中调用父类中的属性或者方法
class Jupiter extends Star {//重写了父类的getName方法getName() {return super.getName() //此时调用的是父类中的getname方法}
}// 访问类型 public private protected
// 1.public 类的内部和外部均可调用
class Car {public name: stringpublic getName() {this.name // ----内部可以使用}
}
const car = new Car()
car.name = 'tesla'// 2.private 类的内部使用
class Car2 {private name: stringpublic getName() {this.name // ----内部可以使用}
}
const car2 = new Car2()
//car2.name = 'tesla' ---- 外部使用会报错
class Tesla extends Car2 {public getName() {//super.name ---- 子类中也不可以使用}
}// 3.protected 类的内部及继承的字类中使用
class Car3 {protected name: stringpublic getName() {this.name // ----内部可以使用}
}
class Byd extends Car3 {public getName() {super.name // 子类中可以使用}
}
const car3 = new Car3()
//car3.name = '' ---- 外部使用会报错// 构造器 constructor 简化了属性的定义和赋值
class Car4 {//public name:string//constructor(name: string) {//this.name = name//}//简化constructor(public name: string) {}
}
const qq = new Car4('qq')
console.log(qq.name)//子类构造器中必须调用父类中的构造器,super()
class Car5 {constructor(public name: string) {}
}
class Yd extends Car5 {constructor(public age: number) {super('car')}
}
(四)get、set和单例模式
// get set
class Food {constructor(private _name: string) {}get name() {//处理代码return this._name}set name(name: string) {//处理代码this._name = name}
}
const food = new Food('apple')
//food.name = "orange" ---- 私有属性无法外不适用,所以需要使用get、set
food.name = 'orange'
console.log(food.name)// 单例模式
class OnlyOne {private static instance: OnlyOneprivate constructor() {}static getInstance() {if (!this.instance) {this.instance = new OnlyOne()}return this.instance}
}const obj1 = OnlyOne.getInstance()
const obj2 = OnlyOne.getInstance()
//无论创建多少实例,都只是同一个对象
(五)ts中的抽象类
//抽象类 可以把它理解成一个公共类,可以把多个类中都有的方法、属性存在抽象类里,由各个类继承抽象类
abstract class MoonPerson {abstract name: stringabstract say(): string
}
// const p = new Person() ---- 抽象类不可以实例化
// 子类中必须实现抽象类中的抽象方法、属性
class Man extends MoonPerson {name: 'tom'sex: 1say() {return 'haha'}
}
class Woman {name: 'jane'sex: 0say() {return 'xixi'}
}//interface也可以用类似抽象类的方式,把多个接口中都有的东西,存在一个接口中,多个接口可以通过继承的方式获取都有的东西,从而简化代码

五、进阶语法

(一)联合类型和类型保护
interface Man {name: stringsex: 1huzi: true
}
interface Woman {name: stringsex: 0dress: true
}
function test(person: Man | Woman) {//console.log(person.dress) ---- 联合类型中只能使用两个类型中都有的属性或者方法 ---- 类型保护可以解决这个问题
}
//类型保护1: 接口中定义了区分不同类型的标记,通过判断标记来判断类型,这也叫做类型断言
function test2(person: Man | Woman) {if (person.sex) {;(person as Man).huzi} else {;(person as Woman).dress}
}
//类型保护2:in 语法
function test3(person: Man | Woman) {if ('huzi' in person) {;(person as Man).huzi} else {;(person as Woman).dress}
}
//类型保护3:typeof 语法
function test4(num1: string | number, num2: string | number) {if (typeof num1 === 'string' || typeof num2 === 'string') {return `${num1}${num2}`} else {return num1 + num2}
}
(二)枚举类型
//枚举类型 ----- 适用于有固定值的数据
enum Status {OFFLINE,ONLINE,DELETED,
}function getStatus(status) {if (status === Status.OFFLINE) {return 'offline'} else if (status === Status.ONLINE) {return 'online'} else if (status === Status.DELETED) {return 'deleted'} else {return 'error'}
}
const res = getStatus(Status.OFFLINE) // ---- 结果为offline2
const res2 = getStatus(0) // ---- 结果为offline2
console.log(res)
console.log(res2)
(三)泛型
//泛型 ---- 数据类型在定义时不确定,在实现时再确定
function fun1<T, P>(first: T, second: P) {return `${first}${second}`
}function fun2<F>(params: Array<F>) {return params
}fun1<number, string>(1, '1') // 也可以写成fun1(1,'2')
fun2<string>(['123'])
//泛型的继承
class DataFucker<T extends number | string> {constructor(private data: T[]) {}getItem(index: number): T {return this.data[index]}
}const arr = new DataFucker<number>([])
const arr2 = new DataFucker<string | number>([])
const arr3 = new DataFucker<string>([])//泛型作为一个具体的类型注解
function hello<C>(params: C) {return params
}
(四)命名空间
//命名空间 ---- 可以理解成模块
//在命名空间中的东西,如果没有通过export 向外界暴露,那么外界是无法直接获取命名空间里的东西的。
namespace Zoo {class HaveDog {name: string}class HaveCat {name: string}export class People {constructor() {new HaveDog()new HaveCat()}}
}
//无法直接获取
//const dog = new HaveDog()
//const cat = new Zoo.HaveDog()//但是可以通过暴露出来的People来获取
const p = new Zoo.People()//当然,命名空间也是可以相互引用的,需要在当前文件中加上:<reference path='./被引用的命名空间文件名.ts'>
(五)配置文件等,后续更新。。。

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

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

相关文章

uniapp项目打包h5,支持文件协议,使用vconsole调试移动端

uniapp项目需要打包h5&#xff0c;并且需要嵌套到一个原生的移动端项目中&#xff0c;需要支持文件协议能直接访问 打包设置 设置./基础路径 引入vconsole调试移动端 <script src"https://unpkg.com/vconsole/dist/vconsole.min.js"></script>可以将…

【Android Jetpack】Lifecycle 感知生命周期

文章目录 背景示例LifeCycle的原理LifecycleOwner自定义LifecycleOwnerLifecycleObserver 示例改进使用LifecycleService解耦Service与组件整个应用进程的生命周期ProcessLifecycleOwner 背景 在Android应用程序开发中&#xff0c;解耦很大程度上表现为系统组件的生命周期与普…

[跑代码]BK-SDM: A Lightweight, Fast, and Cheap Version of Stable Diffusion

Installation(下载代码-装环境) conda create -n bk-sdm python3.8 conda activate bk-sdm git clone https://github.com/Nota-NetsPresso/BK-SDM.git cd BK-SDM pip install -r requirements.txt Note on the torch versions weve used torch 1.13.1 for MS-COCO evaluation…

windows远程桌面登录,提示:“出现身份验证错误,要求的函数不受支持”

问题&#xff1a; windows登录远程桌面&#xff0c;提示&#xff1a;“出现身份验证错误&#xff0c;要求的函数不受支持”&#xff0c;如下图&#xff1a; 问题原因&#xff1a; windows系统更新&#xff0c;微软系统补丁的更新将 CredSSP 身份验证协议的默认设置进行了调…

Windows + docker + python + vscode : 使用容器docker搭建python开发环境,无需本地安装python开发组件

下载docker for Windows docker window下载 如果没有翻墙工具&#xff0c;可以该网盘中的docker 链接&#xff1a;https://pan.baidu.com/s/11zLy3e5kusZR-4m_Fq_cqg?pwdesmv 提取码&#xff1a;esmv 安装docker docker的安装会重启电脑&#xff0c;不要惊讶&#xff0c;且…

Unity 注释的方法

1、单行注释&#xff1a;使用双斜线&#xff08;//&#xff09;开始注释&#xff0c;后面跟注释内容。通常注释一个属性或者方法&#xff0c;如&#xff1a; //速度 public float Speed;//打印输出 private void DoSomething() {Debug.Log("运行了我"); } …

构建智能预约体验:深度解析预约系统源码的代码精髓

随着数字化时代的发展&#xff0c;预约系统在各行业中扮演着越来越重要的角色。本文将深入研究预约系统源码&#xff0c;通过代码示例分析其技术要点&#xff0c;为开发者提供实用的指导&#xff0c;助力构建智能、高效的预约体验。 技术栈综述 预约系统源码采用了现代化的技…

JAVEE初阶 多线程基础(四)

线程安全 一.线程安全存在的问题二.锁三.关于锁的理解四.关于锁操作混淆的理解4.1两个线程是否对同一对象加锁 一.线程安全存在的问题 为什么这里的count不是一百万呢?这就是线程所存在的不安全的问题,由于线程是抢占式执行,同时执行count,操作本质是三个指令 1.load 读取内存…

带大家做一个,易上手的家常炒鸡蛋

想做这道菜 先准备五个鸡蛋 然后将鸡蛋打到碗里面 然后 加小半勺盐 这个看个人喜好 放多少都没问题 不要太咸就好 将鸡蛋搅拌均匀 起锅烧油 油温热了之后 放三个干辣椒进去炒 干辣椒烧黑后 捞出来 味道就留在油里了 然后 倒入鸡蛋液 翻炒 注意翻炒 不要粘锅底 或者 一面糊…

南开大学与字节跳动研究人员推出开源AI工具ChatAnything:用文本描述生成虚拟角色

南开大学与字节跳动研究人员合作推出了一项引人注目的研究&#xff0c;发布了一种名为ChatAnything的全新AI框架。该框架专注于通过在线方式生成基于大型语言模型&#xff08;LLM&#xff09;的角色的拟人化形象&#xff0c;从而创造具有定制视觉外观、个性和语调的人物。 简答…

深度解析 Spring Security 自定义异常失效问题:源码剖析与解决方案

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

设计模式之装饰模式(2)--有意思的想法

目录 背景概述概念角色 基本代码分析❀❀花样重难点聚合关系认贼作父和认孙做父客户端的优化及好处继承到设计模式的演变过程 总结 背景 这是我第二次写装饰模式&#xff0c;这一次是在上一次的基础上进一步探究装饰模式&#xff0c;这一次有了很多新的感受和想法&#xff0c;也…

BUUCTF john-in-the-middle 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 注意&#xff1a;得到的 flag 请包上 flag{} 提交 密文&#xff1a; 下载附件&#xff0c;解压得到john-in-the-middle.pcap文件。 解题思路&#xff1a; 1、双击文件&#xff0c;打开wireshark。 看到很多http流…

基于springboot实现的在线考试系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | springdata-jpa 环境&#xff1a;jdk1.7 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 管理员端-课程管理 03. 管理员端-班级管理 04. 管理员端-老师管理…

AT89S52单片机智能寻迹小车自动红外避障趋光检测发声发光设计

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;寻迹 获取完整说明报告源程序数据 小车具有以下几个功能&#xff1a;自动避障功能&#xff1b;寻迹功能&#xff08;按路面的黑色轨道行驶&#xff09;&#xff1b;趋光功能&#xff08;寻找前方的点光源并行驶到位&…

C++ ini配置文件的简单读取使用

ini文件就是简单的section 下面有对应的键值对 std::map<std::string, std::map<std::string, std::string>>MyIni::readIniFile() {std::ifstream file(filename);if (!file.is_open()) {std::cerr << "Error: Unable to open file " << …

以STM32CubeMX创建DSP库工程方法一

以STM32CubeMX创建DSP库工程方法 略过时钟树的分配和UART的创建等&#xff0c;直接进入主题生成工程文件 它们中的文件功能如下&#xff1a; 1&#xff09;BasicMathFunctions 基本数学函数&#xff1a;提供浮点数的各种基本运算函数&#xff0c;如向量加减乘除等运算。 2&…

【MATLAB】EWT分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EWTFFTHHT组合算法是一种广泛应用于信号处理领域的算法&#xff0c;它结合了经验小波变换&#xff08;Empirical Wavelet Transform&#xff0c;EWT&#xff09;、快速傅里叶变换&#x…

SpringBoot查询指定范围内的坐标点

使用Redis geo实现 redis geo是基于Sorted Set来实现的 Redis 3.2 版本新增了geo相关命令&#xff0c;用于存储和操作地理位置信息。提供的命令包括添加、计算位置之间距离、根据中心点坐标和距离范围来查询地理位置集合等&#xff0c;说明如下: geoadd&#xff1a;添加地理…

DCDC前馈电容与RC串并联电路

一、RC串并联电路特性分析 1、RC串联电路 RC 串联的转折频率&#xff1a; f01/&#xff08;2πR1C1&#xff09;&#xff0c;当输入信号频率大于 f0 时&#xff0c;整个 RC 串联电路总的阻抗基本不变了&#xff0c;其大小等于 R1。 2、RC并联电路 RC 并联电路的转折频率&…