JavaScript:TypeScript网上笔记总结

文章目录

  • 1:基础类型
    • 数值型 number
    • 字符串类型 string
    • 布尔类型 boolean
    • 数组类型 Array
    • 元组 Tuple
    • 任意类型 any
    • void:与any类型相反,表示没有类型
    • null 、undefined类型
    • never类型
    • 枚举类型
    • 类型断言
    • 类型推论|类型别名
  • 2:接口
  • 3:类(不咋用)
    • static 静态属性 和 静态方法
    • 在类中使用接口
    • 抽象类
  • 4:函数
    • 接口定义函数
    • 函数重载
  • 5:联合类型 交叉类型
  • 6:泛型
  • 7.命名空间

TypeScript:

1:基础类型

声明格式:

let 变量名:变量类型 = 赋值内容

数值型 number

let num:number = 123//支持十进制和十六进制字面量
let hexLiteral: number = 0xf00d; 
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;

字符串类型 string

let str:string = '字符串'

布尔类型 boolean

let bool: boolean = false

数组类型 Array

//数组有两种声明方式
let arr: number[] = [1,2,3]
let arr2:Array<number> = [1,2,3] //这里规范了number类型,那么数组内容就必须是number类型//数组内容有多种类型
let arr3:(number | string)[] = [1,'nihao']
let arr4:Array<number | boolean> = [true,1] //在声明的时候使用联合类型

元组 Tuple

TS的新概念:元组是固定数量的不同类型的元素的组合

元组变异的数组,其中的元素类型可以是不同的,而且数量固定,好处在于可以把多个元素作为一个单元传递。

let tuple:[number,string] 
tuple =['nihao',1] //Error
tuple =[1,'nihao'] //需要与声明时规范的类型一一对应//越界时,新增的内容需要是规范的类型中的某一个
tuple.push(true) //error 报错
tuple.push("sss") // 可以//注意 若声明时添加了readonly->只读元组
let tuple2:readonly [number,string] = [111,'aaa']

任意类型 any

let aaa:any
aaa=1
aaa="123"
aaa=false

void:与any类型相反,表示没有类型

一般用于没有返回值的函数,使用void声明的变量没有用处,void类型的变量只能赋值null 、undefined

function fn():void{console.log("This is my warning message");
}
let vv:void = null
let vvv:void= undefined

null 、undefined类型

null 、undefined是所有类型的子类型,表示可以给一个使用number类型的变量赋值null 、undefined

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

never类型

表示用不可能的值,never是任意类型的子类型,但任意类型都不能是never的子类型,任意类型的值都不能赋给never类型的变量除了never类型本身。

//抛出一个值
const errorFunc = (message: string): never => {throw new Error(message);
}//死循环
const infinteFunc = (): never => {while (true) { }
}

枚举类型

枚举类型的声明方式和上述的类型有区别:

//enum 变量名{
// 枚举值,枚举值
//}enum Type {red,blue,green
}
Type.red // 0
Type.blue // 1
Type.green // 2// 枚举值会自增
enum Type2 {red,blue=6,green // 0 6 7
}//枚举值也可以是字符串,
enum Types{Red = 'red',Green = 'green',BLue = 'blue'
}//异构枚举值:表示枚举值既有字符串又有数字
enum Types{No = "No",Yes = 1,
}//接口枚举
enum Types {yyds,dddd}interface A {red:Types.yyds}let arr:A ={red:Types.yyds}
let arr2:A ={red:"12222"} //报错//const 声明的枚举会被编译成常量
const enum ttt{aa,aaa,bb
}//反向映射enum T {fail
} let n = T.fail //0 
let nn = T[n] // 'fail'

类型断言

语法:

<类型>变量 || (变量名 as 类型)

//js的一个函数获取传来的内容的length
const getLength = target => {if (target.length || target.length == 0) {return target.length} else {return target.toString().length}
}
//ts 
//这样写是会报错的类型“string | number”上不存在属性“length”。
//类型“number”上不存在属性“length”
const tsGetLength= (target:(string | number)) =>{if (target.length || target.length == 0) {return target.length} else {return target.toString().length}
}//类型断言:
//<类型>变量 || (变量名 as 类型)
const tsGetLengthaa= (target:(string | number)) =>{if ((<string>target).length || (target as string).length == 0) {return (target as string).length} else {return target.toString().length}}

类型推论|类型别名

//类型推论
let aa = "你好" //这样定义的变量aa,ts会推论出aa为string类型
aa=123 //error 这样就会报错 不能吧number赋值给string类型let bb //这时给bb赋值的是null类型
bb = [] //合法
bb = {} //合法
bb = 'hahha' //合法
//类型别名
//let str:string = "你好"
type s = string //定义一个string类型的类型别名
let str:s = "你好"type T = string | number
let num:T=123
let str1:T="你好"

2:接口

在TS中定义对象的方式要用关键字interface,

接口用来定义一种约束,让数据的结构满足约束的格式。

语法:

interface 接口名 {}
const getFullNameTS = ({fristName,lastName}:{fristName:string,lastName:string}) :string=>{return `${fristName}  ${lastName}`
}//简化
interface nameRule{fristName:string,lastName:string
}
const getFullNameTS = ({fristName,lastName}:nameRule):string=>{fristName:string,lastName:string}) :string=>{
}
//使用接口定义对象
interface Rule{name:string,age:number
}let P:Rule={name:"ddd",age:123
}//如果此时省略不传,是会报错的
//可选属性 可算操作符 ?
interface Rule{name:string,age?:number
}let P:Rule={name:"ddd",
}
//只读属性
interface Rule{readonly name:string, //此时name为只读属性age?:number
}
let P:Rule={name:"ddd",
}
P.name = "aaa" //报错
//任意属性
interface Rule{readonly name:string, //此时name为只读属性age?:number[propName:string]:any //索引签名
}//这样声明后定义对象时传递这里没有约束的规则也不会报错let P:Rule={name:"ddd",sex:"man"
}
//继承接口
interface Rule{readonly name:string, //此时name为只读属性age?:number[propName:string]:any//索引签名
}//这样声明后定义对象时传递这里没有约束的规则也不会报错interface Rule2 extends Rule{ // extends 继承的接口名,继承的接口名fn():void
}//这样声明后定义对象时传递这里没有约束的规则也不会报错

3:类(不咋用)

//simple class
class Animal{name:string //在TypeScript是不允许直接在constructor 定义变量的 需要在constructor上面先声明constructor(name:string) {this.name = nameconsole.log("a "+this.name);},move(distanceInMeters: number = 0) {console.log(`Animal moved ${distanceInMeters}m.`);}
}//类的继承
class Dog extends Animal{bark() {console.log('Woof! Woof!');}
}const dog = new Dog();
dog.bark();
dog.move(10);
dog.bark();//公共,私有与受保护的修饰符 public private protected
//上述name字段时class中的变量,修饰符省略时默认为 public
//public表示类的内部外部都可以访问
//private 修饰符 代表定义的变量私有的只能在内部访问 不能在外部访问 (继承的子类 不能访问)
//protected 修饰符 代表定义的变量私有的只能在内部和继承的子类中访问 不能在外部访问

static 静态属性 和 静态方法

//static 定义的属性和方法 不可以通过this 去访问 只能通过类名去调用
class A {name:stringconstructor(name:string) {this.name = name}static aa:string = "常量"static run():void{this.stop()//如果两个函数都是static 静态的是可以通过this互相调用}static stop():void{//如果两个函数都是static 静态的是可以通过this互相调用}
}
A.aa //diaoyong
A.run()

在类中使用接口

// 使用implements关键字
interface C {name:string
}class A implements C{name:stringconstructor({name}:C) {this.name = name}static aa :string = "常量"staticrun ():string
}

抽象类

//抽象类 需要使用abstract
interface C {name:string
}
abstract class A implements C{name:stringconstructor(name:string) {this.name = name}static aa :string = "常量"abstract run ():string //这里不能写具体分方法,定义的抽象方法必须在派生类实现
}

//派生类

interface C {name:string
}

// 继承抽象类,

class B extends A implements C{constructor({name}:C){super(name)}run(): string {return this.name}
}
let b = new B({name:"不好"})
B.aa
console.log('BBBB',b.run(),B.aa);

4:函数

//simple example
const fn = (name:string,age:number):void=>{console.log(`age:${age},name:${name}`);
}fn('你好',100)//需要与形参上定义的一一对应//默认值
const fn = (name:string = '哈哈'):string=>{return name
}fn("hhahah") //hhahah
fn() // 哈哈

接口定义函数

interface rule {name:string,age?:number,[propName:string]:any
}const fn = ({name,age}:rule):void=>{console.log(`age:${age},name:${name}`);
}fn({name:"aa",age:23})

函数重载

重载是方法名字相同,而参数不同,返回类型可以相同也可以不同。
如果参数类型不同,则参数类型应设置为 any。
参数数量不同你可以将不同的参数设置为可选。
function fn(params: number): void function fn(params: string, params2: number): voidfunction fn(params: any, params2?: any): void {console.log(params)console.log(params2)
}fn(123)
fn('123',456)

5:联合类型 交叉类型

let phone:number = 183555225222 
//此时需要支持座机号,座机号码一般都是010-2293923
//使用联合类型 |
let phone:number | string = '010-0101010' || 183555225222 //交叉类型 &
interface Person {name:string,age:number
}interface Man {sex:string
}const sss = (man:(Man & Person)):void=>{console.log(man.age)console.log(man.sex)console.log(man.name)
}sss({name:"xiaosong",age:12,sex:"man"
})

6:泛型

定义函数、类的时候不预先指定类型,在使用的时候再指定类型

//假设存在一个这样的函数 输出a,b参数组成的数组,
function num(a:number,b:number):Array<number>{ 输入number类型的数据返回一个number类型的数组return [a,b]
}console.log(num(1,2));
num('1','2')//这样TS就会报错//使用泛型
//定义时类型时不明确的
function change<T>(params1:T,params2:T):Array<T>{return [params1,params2]
}//使用时需要明确类型
change<number>(1,2)
change<string>('1','2') // change('1','2')编译器会根据传入的参数自动地确认类型

6.1:泛型约束

function prop<T,K extends keyof T>(obj:T,key:K){ //K extends keyof T 约束了T的类型return obj[key]
}

7.命名空间

假设存在两个文件 index1.ts 、 index2.ts

// index1.ts 中定义了一个变量a
const a = 123
// index2.ts 中也定义了一个变量a
const a = 456

这时index2.ts声明的变量会报错,这样定义的变量是全局的,const定义的变量具有唯一性。

解决:

方法一

//index2.ts 中使用export关键字,将index2.ts文件中的a定义为局部变量
export const a = 456

方法二,使用命名空间

//index1.ts中:
namespace A {export const a = 123
}
//index2.ts中:
namespace B {export const a = 3455
}//使用时:
console.log(A.a)
console.log(B.a)

嵌套命名空间:

namespace a {export namespace b {export class Vue {parameters: stringconstructor(parameters: string) {this.parameters = parameters}}}
}let v = a.b.Vue
new v('1')

抽离命名空间

//index.ts内容
export namespace VVV {export a="抽离"
}
//假设使用时的文件是合index.ts平级
import {VVV} form './index.ts'
console.log(VVV) // 打印出来 : {a:"抽离"}

简化命名空间

namespace A {export namespace B {export vvv = 12345}
}import temp = A.B.vvv
console.log(temp) 
//这样就可以直接打印出vvv的值

合并命名空间

//重名的命名空间会合并
namespace A {export const a = 123
}
namespace A {export const b = 123
}
//那么 A这个命名空间里就存在a、b两个变量

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

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

相关文章

WordPress Wholesale Market 插件 任意文件读取漏洞复现

0x01 产品简介 WordPress plugin Wholesale Market 是一个woocommerce扩展插件&#xff0c;使您的商店能够创建批发用户&#xff0c;并通过设置产品的批发价格。 0x02 漏洞概述 WordPress plugin Wholesale Market 2.2.1之前版本存在路径遍历漏洞&#xff0c;该漏洞源于没有…

海南省月降水量分布数据

海南省位于中国南端&#xff0c;海南岛地处热带北缘&#xff0c;属热带季风气候&#xff0c;长夏无冬。海南省雨量充沛&#xff0c;年降水量在1000毫米&#xff5e;2600毫米之间&#xff0c;年平均降水量为1639毫米&#xff0c;有明显的多雨季和少雨季。每年的5&#xff5e;10月…

Django资源路径问题

学习过django框架的应该了解后端有static静态文件&#xff0c;media媒体文件&#xff0c;还有一些其他的配置文件&#xff0c;那么在整个web服务中每个区域访问资源的路径有什么区别呢 前端模版中src 一般本地项目的src都是写项目中的相对路径或者根据电脑磁盘的绝对路径 而在…

鸿蒙Harmony应用开发—ArkTS-转场动画(组件内隐式共享元素转场)

geometryTransition用于组件内隐式共享元素转场&#xff0c;在组件显示切换过程中提供平滑过渡效果。通用transition机制提供了opacity、scale等转场动效&#xff0c;geometryTransition通过id绑定in/out组件(in指入场组件、out指出场组件)&#xff0c;使得组件原本独立的trans…

Apache Flink 中 Watermark 机制详解及其核心原理与应用示例

Watermark&#xff08;水印&#xff09;概念 在 Apache Flink 流处理框架中&#xff0c;Watermark 是一个关键的时间概念&#xff0c;用于处理事件时间窗口&#xff08;event-time processing&#xff09;中的乱序事件问题。事件时间是指事件本身携带的时间戳&#xff0c;而非…

RabbitMQ--03--SpringAMQP(SpringBoot集成RabbitMQ)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 SpringAMQP1.SpringBoot 的支持https://spring.io/projects/spring-amqp 2.RabbitTemplate3.RabbitListener&#xff08;终极监听方案&#xff09;4.RabbitConfig--…

AI趋势(02)感性/理性双视角理解ChatGPT实现原理

说明&#xff1a;本文主要为非AI专业人士更快速了解和理解AI的角度来进行编写。 1 感性理解ChatGPT实现原理 这里用一个有趣的故事来解释 ChatGPT 的实现原理。 想象一座魔法图书馆&#xff0c;里面收藏着无数的书籍&#xff0c;每本书都是关于人类语言的。这座图书馆里有一…

基于Springboot的防疫物资管理信息系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的防疫物资管理信息系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

IOS/Android App备案(uniapp)

IOS/App备案 IOS备案Android备案 IOS备案 准备好p12证书即可 链接: https://aitoolnav.caichuangkeji.com/#/AppMd5 Android备案 上DCLOUD开发者中心&#xff0c;找到相关应用后&#xff0c;直接查看证书即可获取到MD5 公钥&#xff1a;先根据上述页面下载证书&#xff0c;…

GaussDB(分布式)实例故障处理

一、说明 GaussDB Kernel实例出现故障时&#xff0c;可以按照本节的办法进行实例快速修复。 1、执行gs_om -t status --detail查看集群状态&#xff0c;cluster_state为Normal&#xff0c;balanced为No&#xff0c;请重置实例状态。 2、执行gs_om -t status --detail查看集群…

Python的内建比较函数cmp比较原理剖析

Python中的cmp()函数用于比较两个对象的大小。 cmp( x, y)&#xff1a;比较2个对象&#xff0c;前者小于后者返回-1&#xff0c;相等则返回0&#xff0c;大于后者返回1. Python的cmp比较函数比较原理 Python的cmp函数可以比较同类型之间&#xff0c;或者不同数据类型之间。然…

vue2 中使用音频

vue2 中使用音频 在 template 页面 写入 audio 标签 <template><div><audio ref"moreAudio" :src"moreAudioSrc"></audio><audio ref"noAudio" :src"noAudioSrc"></audio></div> </t…

2024 用CleanMyMac X为您的MAC清理提速吧

CleanMyMac X 是由 MacPaw 公司开发的一款针对 macOS 操作系统的电脑清理工具。它可以帮助用户清理电脑中的垃圾文件、卸载不需要的软件、优化电脑性能等。它的界面简洁明了&#xff0c;操作简单易懂&#xff0c;非常适合普通用户使用。 链接: https://pan.baidu.com/s/1_TFnrI…

微信小程序自定义组件

微信小程序中的自定义组件是指在微信小程序中创建的可重用的、可复用的组件&#xff0c;它可以被多个页面使用。自定义组件可以帮助我们提高开发效率&#xff0c;提高代码的可维护性和可重用性。以下是微信小程序中自定义组件的使用方法&#xff1a; 一. 创建自定义组件 首先…

练习 10 Web [MRCTF2020]你传你呢

和test5一样&#xff0c;文件上传限制为图片&#xff0c;使用.htaccess文件让上传成功图片木马文件进行执行 开屏暴击&#xff0c;差点去世 尝试上传文件 各种过滤&#xff0c;但是能传图片&#xff0c;这里就不写了&#xff0c;我做过的test5遇到过的重复内容 直接尝试在te…

【算法设计与分析】实现Trie前缀树

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 Trie&#xff08;发音类似 "try"&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串…

一个优秀的开源ChatGpt外壳项目(lobe-chat)

lobe-chat 简介&#xff1a; 开源、现代化设计的 ChatGPT/LLMs 聊天应用与开发框架支持语音合成、多模态、可扩展的插件系统&#xff0c;一键免费拥有你自己的 ChatGPT/Gemini/Ollama 应用。 下载lobe-chat lobe-chat项目开源地址&#xff1a;GitHub - lobehub/lobe-chat: &am…

HTML:浏览器CSS样式前缀

在编写CSS样式时&#xff0c;特别是在处理CSS3以及特定浏览器特有的CSS扩展属性时&#xff0c;为了兼容不同的浏览器&#xff0c;可能需要在CSS属性前面添加特定的浏览器厂商前缀。以下是一些常见的浏览器厂商前缀&#xff1a; .example {/* 普通写法 */transform: rotate(30d…

Maven,pom.xml,查找 子jar包

在IDEA打开pom.xml&#xff0c;会看到这里&#xff1a; 然后如果有需要&#xff0c;把相关的 子jar包 去掉 <dependency><groupId>XXX</groupId><artifactId>XXX</artifactId><exclusions><exclusion><artifactId>xxx</a…

利用opencv获取系统时间

前一篇《c获取系统时间的方法-CSDN博客》博客介绍了如何在不同系统中获取系统时间的方法&#xff0c;但这些方法受系统的限制&#xff0c;如time.h就只能在Linux系统中使用。而opencv则不受系统限制&#xff0c;示例代码如下&#xff0c; #include <opencv2/opencv.hpp>…