typeScript基础使用与进阶

news2024/11/29 12:55:16

typeScript基础使用与进阶

  • 一、初始typeScript
    • 1.1 js的超集
    • 1.2 编译器编译为js代码
    • 1.3 完全兼容js
    • 1.4 静态类型检查器
  • 二、ts的安装与编译
    • 2.1 ts的安装
    • 2.2 ts编译成js
      • 2.2.1 手动编译
      • 2.2.2 自动编译
  • 三、ts基础使用
    • 3.1 类型声明
      • 3.1.1 基础类型
      • 3.1.2 数组
      • 3.1.3 对象
      • 3.1.4 any类型
      • 3.1.5 void类型
      • 3.1.6 类型推断
      • 3.1.7 联合类型
    • 3.2 接口
      • 3.2.1 对象类型
      • 3.2.2 数组类型
      • 3.2.3 函数类型
    • 3.3 函数
      • 3.3.1 函数声明和函数表达式
      • 3.3.2 可选参数和默认参数
      • 3.3.3 剩余参数和函数重载
      • 3.3.4 类型断言
  • 四、ts进阶
    • 4.1 类型别名
    • 4.2 字符串字面量
    • 4.3 元组
    • 4.4 枚举
    • 4.5 泛型的简单使用
    • 4.6 泛型约束
    • 4.7 泛型接口

一、初始typeScript

  • typeScript官网
  • typeScript中文文档

1.1 js的超集

  • 1.包含js的所有元素
  • 2.能运行js代码
  • 3.支持es语法
  • 4.是一种开源开平台的项目

1.2 编译器编译为js代码

  • 编译器将ts代码编译为js代码,js解析器执行

1.3 完全兼容js

1.4 静态类型检查器

  • 1.静态类型,更加严格的语法
  • 2.减少运行时异常出现的几率
  • 3.便于后期维护

二、ts的安装与编译

2.1 ts的安装

  • 终端命令执行
npm install -g typescript
  • 检测ts版本
tsc -v

2.2 ts编译成js

2.2.1 手动编译

  • 终端执行 tsc (文件).js 会生成xxx.js文件
tsc xxx.js

2.2.2 自动编译

  • 1.执行初始化 打开终端 执行命令
tsc --init
  • 2.修改生成的配置文件 tsconfig.json
//文件的存放位置
 "outDir": "./js"
 //关闭严格模式
 "strict": false
  • 3.启动监视任务
    • 1.打开终端 =>运行任务
      在这里插入图片描述
    • 2.运行任务=>显示所有任务=>监视tsconfig.json
      在这里插入图片描述

三、ts基础使用

3.1 类型声明

3.1.1 基础类型

布尔类型 boolean

let flag: boolean = true
flag = false

数字类型 number

//数字类型  支持不同进制
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
// ES6 中的二进制表示法
let binaryLiteral: number = 0b1010;
// ES6 中的八进制表示法
let octalLiteral: number = 0o744;
let notANumber: number = NaN;
let infinityNumber: number = Infinity;

字符串类型 string

let myName: string = 'Tom';
let myAge: number = 25;

// 模板字符串
let sentence: string = `Hello, my name is ${myName}.
I'll be ${myAge + 1} years old next month.`;

undefined和null 类型

//undfined null类型   用的不多
let u: undefined = undefined
let n: null = null

3.1.2 数组

//定义数组
//第一种方式
let arr1: number[] = [1, 2, 3, 4, 5]
arr1 = [3, 4, 5, 6, 7]
//第二种方式  泛型
let arr2: Array<number> = [1, 2, 3, 4, 5]

3.1.3 对象

// object 表示非原始类型,除了number、string、boolean之外的类型
let obj:object={}
// 字面量
// obj=123 报错
// obj='' 报错
obj=null
obj=undefined
obj=[]
obj=new String()
obj=String

3.1.4 any类型

//any 任何类型
let h: any = 123
h = true
h = '123'
h = {
  age: '张三',
}

let arr: any[] = [100, '2', '', true]
//报错
console.log(arr[0].split(''))

3.1.5 void类型

//表示空值 表示没有任何返回值的函数
function test1(): void {
  console.log('test1')
}
console.log(test1())

//表示没有任何类型
let v: void = undefined

3.1.6 类型推断

  • ts在没有明确的指定类型的时候推测一个类型
  • 1.定义变量的时候,直接给变量赋值,则定义类型为对应的类型
  • 2.定义变量的时候,没有赋值,则定义类型为any类型
//两种情况
//1.定义变量直接赋值  赋值类型则定义为相对应的类型
let a = 1
a = 2

//2.定义变量的时候 没有赋值  只声明了没有赋值 会被定义为any
let g
g = 123
g = ''
g = {}

3.1.7 联合类型

// 表示取值可以为多种类型中的一种
// flag true,1 false,0 ||
let f: boolean | number | string = true
// 只能访问此联合类型的所有类型里共有的属性或方法
// f = 123 //再次赋值,走类型推断,给变量定义一个类型
f="123"
// f=true
console.log(f.toString());

3.2 接口

  • 定义:它是对行为的抽象,用于对「对象的形状(Shape)」进行描述,理解为一种约束
  • 接口一般首字母大写 建议加上I
  • ?表示可选属性 可有可无
  • [propName: string]: any 任意属性定义 和任意属性值
  • readonly 只读属性

3.2.1 对象类型

//定义接口
//接口一般首字母大写  建议加上I
// ?表示可选属性  可有可无
// [propName: string]: any  任意属性定义  和任意属性值
//readonly  只读属性
interface IPerson {
  readonly id: number
  name: string
  age: number
  sex?: string
  [propName: string]: string | number
}
let p: IPerson = {
  id: 10,
  name: '张三',
  age: 18,
  //   sex: '男',
  width: '',
}
//报错 只读属性
p.id = 10

3.2.2 数组类型

// 不常用,理解
interface INewArray{
    [index:number]:number//任意属性,index表示数组中的下标
}
// [1,2,3,4]  arr[0]-->obj['name']
//  0,1,2,3
let arr:INewArray=[1,2,3,4]

3.2.3 函数类型

//参数 返回值
interface IsearchFunc {
  // (参数:类型....):返回值的类型
  (a: string, b: string): boolean
}
const fun1: IsearchFunc = function (a: string, b: string): boolean {
  return true
}
fun1('a', 'b')

3.3 函数

3.3.1 函数声明和函数表达式

//命名函数  (函数声明)
function add1(a, b) {
  return a + b
}

//函数表达式 (匿名函数)
let add2 = function (a, b) {
  return a + b
}

//ts中函数声明 命名函数
function add3(a: number, b: number): number {
  return a + b
}

let c: number = add3(1, 2)
//函数表达式 匿名函数
let add4 = function (a: number, b: number): number {
  return a + b
}

//ts函数完整的写法
let add5: (a: number, b: number) => number = function (
  a: number,
  b: number
): number {
  return a + b
}

3.3.2 可选参数和默认参数

//可选参数 必选参数不能位于可选参数后
let getName = function (x: string = '李', y?: string) {
  return x + y
}

// getName('张', '三')
getName()

3.3.3 剩余参数和函数重载

//剩余参数
function fn(x: string, y: string, ...args: number[]) {
  console.log(x, y, args)
}
fn('', '', 1, 2, 3, 4, 5)

//函数重载  函数名相同  形参不同的多个函数
//数字 相加    字符串 拼接
function fn1(x: string | number, y: string | number): string | number | void {
  if (typeof x == 'string' && typeof y == 'string') {
    //字符串拼接
    return x + y
  } else if (typeof x == 'number' && typeof y == 'number') {
    //数字相加
    return x + y
  }
}
fn1(1, 2)

3.3.4 类型断言

//定义一个函数 获取到一个数字或者字符串的长度
//类型断言:手动指定一个类型
//两种方式
//1.通过as  变量 as 类型
//2.通过<类型>变量
function getLength(x: string | number): number {
  if ((x as string).length) {
    return (<string>x).length
  } else {
    return x.toString().length
  }
}
//2.通过<类型>变量
getLength('123')
getLength(123)

//将任何一个类型断言为any,any类型是访问任何属性的方法的
;(window as any).a = 10

function abc(x: any, y: any): any {
  return x + y
}
let a = abc(1, 2) as number //类型断言
let b = abc('x', 'y') as string

四、ts进阶

4.1 类型别名

  • 通过type去定义 ,用来给一个类型起个新名字
//通过type 类型别名
type s = string
let str: s = '123'
//常用于联合类型
type s1 = string | number | boolean
let a: s1 = 123
let b: s1 = 123

4.2 字符串字面量

  • 通过type去定义 ,用来约束取值只能是某几个字符串中的一个
//字符串字面量类型  约束取值只能是某几个字符串中的一个

//张三丰 ,张三 张大炮
type stringType = '张三丰' | '张三' | '张大炮'
let names: stringType = '张三'

4.3 元组

  • 合并了不同类型的对象
let arr: number[] = [1, 2, 3, 4, 5]

//数值和字符串

//元组合并了不同类型的对象

let Tarr: [number, string] = [1, '2']

//元组添加东西 需要是number或者string类型string
Tarr.push('2', 5)

//报错
Tarr.push(true)

4.4 枚举

  • 给一组数值赋予名称
//使用枚举类型给一组数值赋予名称
//可以通过名称拿取值  还可以通过值拿去名称
//1,2,3,4
enum NumberType {
  one = 1, //手动赋值   没有赋值 第一个参数默认为0
  two, //后边的值不定义 会根据前边的值 进行累加
  three,
  four,
}
//手动赋值 尽量不要写一些重复的值
console.log(NumberType.one)

//枚举项有两种类型:常数项(constant member)和计算所得项(computed member)
enum color {
  red,
  blue = 'blue'.length,
  //计算所得项需要放置在已经确定赋值的枚举项之前 后边不要再存放为手动赋值的枚举项
  //   green,
  green = 3,
}

//常数枚举是使用 const enum 定义的枚举类型
// 常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员
const enum Obj {
  o,
  b,
  //报错
  //   j='j'.length,
}

//外部枚举 (Ambient Enums)是使用 declare enum 定义的枚举类型
declare enum B {
  a,
  b,
  c,
}

4.5 泛型的简单使用

  • 在定义时不需要先确定类型,而是使用的时候再去确定
//需求 定义一个函数,传入两个参数 第一个参数是数据 第二个参数是数量
// 函数的作呕给你:根据数量产生对应个数的数据,存放在一个数组中
//(123,3)==>[123,123,123]

function getArr(value: number, count: number): number[] {
  const arr: number[] = []
  for (let i = 0; i < count; i++) {
    arr.push(value)
  }
  return arr
}

//原则上不推荐使用any
//使用泛型  在定义时不需要先确定类型 而是使用的时候再去确定
//没有确定的话  追走类型推断
//T表示任意输入的类型
function getArr2<T>(value: T, count: number): T[] {
  const arr: T[] = []
  for (let i = 0; i < count; i++) {
    arr.push(value)
  }
  return arr
}

getArr2(123, 3)
getArr2<string>('123', 2)

4.6 泛型约束

//获取一个参数的长度
function getLength<T extends Ilength>(x: T): number {
  return x.length
}
//使用泛型约束  约束任意输入的类型  必须要有length属性
interface Ilength {
  length: number
}
getLength('123')

4.7 泛型接口

//定义一个泛型接口
interface Iarr {
  <T>(value: T, count: number): Array<T>
}

let getArr1: Iarr = function <T>(value: T, count: number): T[] {
  const arr: T[] = []
  for (let i = 0; i < count; i++) {
    arr.push(value)
  }
  return arr
}

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

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

相关文章

bug: https://aip.baidubce.com/oauth/2.0/token报错blocked by CORS policy

还是跟以前一样&#xff0c;我们先看报错点&#xff1a;&#xff08;注意小编这里是H5解决跨域的&#xff0c;不过解决跨域的原理都差不多&#xff09; Access to XMLHttpRequest at https://aip.baidubce.com/oauth/2.0/token from origin http://localhost:8000 has been blo…

错误号码2058 Plugin caching_sha2_password could not be loaded:vX八白白白白白令自砸

sqlyog连接数据库时报错&#xff1a; 错误号码2058 Plugin caching_sha2_password could not be loaded:vX八白白白白白令自砸 网上查了资料&#xff0c;是MySQL 从 8.0 版本开始加密方式改变导致的原因。具体的咋也不再这里分析了&#xff0c;就直说如何解决这个问题。下面三…

由于找不到vcruntime140.dll无法继续执行代码

在计算机使用过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中之一就是“vcruntime140.dll丢失”。这个错误通常发生在运行某些程序或游戏时&#xff0c;它会导致程序无法正常运行。那么&#xff0c;如何解决vcruntime140.dll丢失的问题呢&#xff1f;本文将介绍…

基于单片机的滚筒洗衣机智能控制系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统整体设计方案2.1控制系统的功能2.2设计的主要内容 二、硬件设计3.1 控制系统整体框图3.2 电源电路 三 软件设计主程序设计仿真设计 四、 结论 概要 因此我们需要一个完善的智能系统来设计一个全自动滚筒洗…

【unity实战】教你轻松构建对话系统

先来看最终效果 前言 欢迎来到我们的Unity实战教程系列。在这一篇中&#xff0c;我们将深入探讨如何在Unity中构建一个对话系统。 对话系统是许多游戏中不可或缺的一部分&#xff0c;特别是在角色扮演游戏&#xff08;RPG&#xff09;、冒险游戏和视觉小说等类型中。它们为玩…

selenium自动化测试入门 —— python unittest单元测试框架

unittest又名PyUnit&#xff0c; Python单元测试框架&#xff08;The Python unit testing framework&#xff09;&#xff0c;简称为PyUnit。自从 Python 2.1 版本后&#xff0c;PyUnit成为 Python标准库的一部分。 为什么需要使用unittest单元测试框架&#xff1f; 当我们写…

MIT6.5830 Lab1-GoDB实验记录(五)

MIT6.5830 Lab1-GoDB实验记录&#xff08;五&#xff09; – WhiteNights Site 标签&#xff1a;Golang 完成了Exercise 1&#xff0c;还有四个Exercise在等着我&#xff0c;慢慢来吧。 实验准备 了解缓冲池 缓冲池&#xff0c;俗称BP。相关的概念还有数据页和缓存页。页&…

VueX 模块化和namespace

当我们的项目很大的时候&#xff0c;VueX中的代码会越来越多&#xff0c;会有处理数据的&#xff0c;处理人员列表的&#xff0c;处理订单的... 如果我们将这些东西都写在一个state、actions和mutations中的话&#xff0c;就非常不方便后期的维护。 所以我们引入了VueX的模块…

Linux的指令和用途(持续更新)

1. 基本指令&#xff1a; 概念介绍&#xff1a; 1. 目录&#x1f7f0;文件夹 Linux指令用法说明who查看哪些人登陆我的机器whoami (who am i)查看当前账号是谁 pwd 查看当前我所在的目录clear 清屏 tree 目录名&#xff08;文件夹名&#xff09;以树形结构列出该文件夹下的所有…

深度学习之基于Tensorflow人脸面部表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 基于Tensorflow的人脸面部表情识别系统是一种基于深度学习技术的图像处理应用&#xff0c;该系统主要通过人脸图像数…

【Unity实战】最全面的库存系统(五)

文章目录 先来看看最终效果前言配置商店系统数据创建另一个NPC绘制商店UI控制商店开关列出商品添加和删除物品功能添加商品到购物车购买商品购物车删除物品商店预览效果购买和出售切换出售功能保存商店数据快捷栏物品切换和使用完结 先来看看最终效果 前言 本期也是最好一期&a…

最新 vie-vite框架下 jtopo安装使用

官方地址 官方源码 安装下载 1.官方好像都没有给git地址&#xff0c;尝试npm安装报错 2.找到1.0.5之前的版本npm i jtopo2&#xff0c;安装成功后使用报错&#xff0c;应该是版本冲突了 1.本地引入&#xff0c; 点击官方源码下载&#xff0c;需要jtopo_npm文件 2.引入到本…

【wp】2023鹏城杯初赛 Web web1(反序列化漏洞)

考点&#xff1a; 常规的PHP反序列化漏洞双写绕过waf 签到题 源码&#xff1a; <?php show_source(__FILE__); error_reporting(0); class Hacker{private $exp;private $cmd;public function __toString(){call_user_func(system, "cat /flag");} }class A {p…

使用Renesas Flash Programmer(RFP)修改Option Byte及刷写程序

文章目录 前言配置Project修改OPBT程序刷写其他操作总结 前言 瑞萨RH850 P1H-C系列&#xff0c;在之前不知道OPBT对程序影响这么大&#xff0c;导致意外操作了其中的寄存器&#xff0c;板子锁死&#xff0c;不能再次刷写程序。本文记录下使用RFP工具刷写Option Byte需要注意的…

【C语法学习】10 - scanf()函数

文章目录 0 前言1 函数原型2 参数2.1 格式字符串2.1.1 转换说明 2.2 参数列表 3 返回值4 读取机制4.1 基本概念4.2 转换说明4.3 读取过程4.4 读取示例4.5 多参数 6 示例6.1 示例16.2 示例26.3 示例36.4 示例4 0 前言 scanf()函数虽然使用起来较为灵活&#xff0c;但是其读取机…

项目实战:分页功能实战

1、在index.html添加点击事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"><script src"scr…

VX-3R APRS发射试验

VX-3R本身是不带APRS功能的&#xff0c;不过可能通过外加TNC实现APRS功能。 有大佬已经用Arduino实现了相应的发射功能&#xff1a; https://github.com/handiko/Arduino-APRS 我要做的&#xff0c;就是简单修改一下代码&#xff0c;做一个转接板。 YEASU官方没有给出VX-3R的音…

基于单片机的智能饮水机系统

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统设计方案分析2.1 设计功能及性能分析2.2设计方案分析 二、系统的硬件设计3.1 系统设计框图系统软件设计4.1 总体介绍原理图 四、 结论 概要 现在很多学校以及家庭使用的饮水机的功能都是比较单一的&#…

【完美世界】石昊拒绝云曦相认,爱而不得,云曦悲伤无助

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料《完美世界云曦篇》最新一集&#xff0c;为了云曦&#xff0c;石昊不远十万里&#xff0c;亲自送她回家&#xff0c;这份感情之真挚&#xff0c;绝对毋庸置疑。然而&#xff0c;令人感到不解的是&…

读书笔记:《图解机械原理与构造》

通用零部件 轴&#xff1a;支撑回转零件 转轴&#xff1a;弯矩和转矩转动轴&#xff1a;转矩心轴&#xff1a;弯矩直轴曲轴软轴 轴承&#xff1a;支撑轴旋转 滑动轴承&#xff1a;承载高速旋转 径向滑动轴承&#xff1a;径向载荷推力滑动轴承&#xff1a;轴向载荷 滚动轴承&am…