学习TS看这一篇就够了!

目录

    • TS的优点和缺点
    • 基础类型
      • 数字类型
      • 布尔类型
      • 字符串类型
      • void 类型
      • null 类型和 undefined 类型
      • bigint类型
      • Symbol类型
    • 其他类型
      • 数组
      • 元组
      • 枚举Enum
      • 对象和函数
      • any void never unknown 的区别是什么
      • 泛型 Generic
      • 交叉类型
      • 联合类型
    • 特殊符号 ? ?. ?? ! _
    • 修饰符

TS的优点和缺点

优点

  • 静态类型

  • 有类型错误,编译时就报错(而非运行时)
    在这里插入图片描述

  • 智能提示,提高开发效率和稳定性
    在这里插入图片描述
    缺点

  • 有一定学习成本

  • 某些情况下,类型定以过于混乱,可读性不好
    在这里插入图片描述

基础类型

  • boolean
  • number
  • string
  • void
  • null
  • undefined
  • bigint
  • symbol

变量声明语法:冒号 : 前面是变量名称,后面是变量类型。

数字类型

const n:number = 100

布尔类型

const b:boolean = false;
const b2:boolean = Boolean(0);

字符串类型

let str:string = 'hello';

void 类型

当一个函数没有返回值时,可以将其返回值类型定义为 void:

function doNothing(): void {let a  = 10
}

null 类型和 undefined 类型

const a:undefined = undefined;
const b:null = null;

bigint类型

JavaScript 中可以用 Number 表示的最大整数为 2^53 - 1,可以写为 Number.MAX_SAFE_INTEGER。如果超过了这个界限,可以用 BigInt来表示,它可以表示任意大的整数。

语法:在一个整数字面量后加 n 的方式定义一个 BigInt,如:10n 或者调用函数 BigInt():

const theBiggestInt: bigint = 9007199254740991n
const alsoHuge: bigint = BigInt(9007199254740991)
const hugeString: bigint = BigInt("9007199254740991")theBiggestInt === alsoHuge // true
theBiggestInt === hugeString // true

Symbol类型

Symbol() 函数会返回 symbol 类型的值。每个从 Symbol() 返回的 symbol 值都是唯一的。

const sym1: symbol = Symbol()
const sym2: symbol = Symbol('foo')
const sym3: symbol = Symbol('foo')console.log(sym2 === sym3) // false

其他类型

数组

let arr:number[] = [1,2,3];
let strs:string[] = ['点''关注'];
const list:Array<number> = [1,2,3];

元组

相同类型元素组成成为数组,不同类型元素组成了元组(Tuple)。

const list: [string, number] = ['Sherlock', 1887]   // okconst list1: [string, number] = [1887, 'Sherlock']  // error

枚举Enum

一组相同主题的数据

enum Direction { Up, Down, Left, Right }enum Months { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }enum Size { big = '大', medium = '中', small = '小' }enum Agency { province = 1, city = 2, district = 3 }

声明一个枚举类型,如果没有赋值,它们的值默认为数字类型且从 0 开始累加

enum Months {Jan,Feb,Mar,Apr
}Months.Jan === 0 // true
Months.Feb === 1 // true
Months.Mar === 2 // true
Months.Apr === 3 // true

现实中月份是从 1 月开始的,那么只需要这样:

// 从第一个数字赋值,往后依次累加
enum Months {Jan = 1,Feb,Mar,Apr
}Months.Jan === 1 // true
Months.Feb === 2 // true
Months.Mar === 3 // true
Months.Apr === 4 // true

枚举类型的值为字符串类型:

enum TokenType {ACCESS = 'accessToken',REFRESH = 'refreshToken'
}// 两种不同的取值写法
console.log(TokenType.ACCESS === 'accessToken')        // true
console.log(TokenType['REFRESH'] === 'refreshToken')   // true

枚举的取值,有 TokenType.ACCESS 和 TokenType[‘ACCESS’] 这两种不同的写法,效果是相同的。

不可枚举:不可枚举是一个汉语成语,拼音为bù kě méi jǔ,意思是不能够一个个地列举,形容数量、种类极多。这个成语出自元王恽《秋涧全集·紫山先生易直解序》,其中提到“其至公正之大论,卓异特达之举,固不可枚举。”它形容的是数量非常多,多到无法计算的情况。

对象和函数

interface User {name:string,age:number,sayHi:(a:string) =>string;
}
const user:User = {name:'江拥',age:18,sayHi(a:string){return a;};
}

any void never unknown 的区别是什么

  • any 任意类型,和JS一样不进行任何类型检查,比较危险

  • void: 和any相反,没有类型, 一般应用于函数返回值
    function f(): void {} //意思是这个函数没有返回值

  • never:永远不存在的类型

  • unknown:未知的类型(更加安全的any)

const b:unknown = 100;
(b as string).length  //as 手动类型转换。相当于告诉TS编译器:我知道b的类型,我对安全负责

泛型 Generic

泛型是指在定义函数、接口或者类时,未指定其参数类型,只有在运行时传入才能确定。那么此时的参数类型就是一个变量,通常用大写字母 T 来表示,当然你也可以使用其他字符,如:U、K等。

//定义在函数
function fn<T>(arg:T):T{return arg;
}
const x = fn<number>(100);function fn2<T,U>(a:T,b:U){console.log(a,b);
}
fn2<string,number>('x',18);//定义在class
class someClass<T>{name:T,constructor(name:T){this.name = name;}getName():T{trtuen this.name;}
}const s1 = new someClass<string>('江拥');
const s2 = new someClass<number>(10000);//定义在Type (不常用)
const mf:<U>(arg:U) => U = fn;//定义在interface
interface GenericIdentityFn {<T>(arg: T): T
}function identity<T>(arg: T): T {return arg
}let myIdentity: GenericIdentityFn = identity

交叉类型

在这里插入图片描述
在这里插入图片描述

联合类型

在这里插入图片描述
在这里插入图片描述

特殊符号 ? ?. ?? ! _

//? 可选
interface User {name:stringage?:number
}
const u:User = { name:'江拥' }function fn(a:number,b?:number){console.log(a,b)
}
fn(10)// ?.  可选链
const user:any = {info:{city: '北京'}
}
const city = user?.info?.city;// ?? 空值合并运算符
//只有左侧是null或undefined,才会返回右侧
const user1:any = {name:'江拥',index:0
}
const n1 = user1.name ?? '暂无姓名';  //相当于const n1 = user1.name || '暂无姓名'; 
const n2 = user1.index ?? '暂无index';//! 非空断言
function fn1(a?:string){return a!.length  //!表示告诉TS自己知道a不会是undefined
}//_  下划线 数字分隔符
const giveme= 1_000_000;  //就是1000000  一百万

修饰符

在 TypeScript 中,有以下几种修饰符用于控制类的成员的访问权限:

  1. public:公共修饰符,默认修饰符,可以在类的内部和外部访问。

  2. private:私有修饰符,只能在类的内部访问,不能在类的外部访问。

  3. protected:受保护修饰符,可以在类的内部和子类中访问,但不能在类的外部访问。

  4. readonly:只读修饰符,只能在声明时或构造函数内部赋值,之后不可修改。

class Person {public name: string;private age: number;protected gender: string;readonly id: number;constructor(name: string, age: number, gender: string, id: number) {this.name = name;this.age = age;this.gender = gender;this.id = id;Person.count++;}public sayHello() {console.log(`Hello, my name is ${this.name}.`);}private getAge() {return this.age;}protected getGender() {return this.gender;}
}class Student extends Person {public school: string;constructor(name: string, age: number, gender: string, id: number, school: string) {super(name, age, gender, id);this.school = school;}public introduce() {console.log(`I am a student. My name is ${this.name}, and I study at ${this.school}.`);}
}let person = new Person("Alice", 25, "female", 123);
console.log(person.name);  // 可以访问 public 成员
person.sayHello();  // 可以访问 public 方法// console.log(person.age);  // 不能访问 private 成员
// console.log(person.gender);  // 不能访问 protected 成员console.log(person.id);  // 可以访问 readonly 成员console.log(Person.count);  // 可以直接访问静态成员
console.log(Person.getCount());let student = new Student("Bob", 20, "male", 456, "XYZ School");
console.log(student.name);  // 可以访问从父类继承的 public 成员
console.log(student.school);  // 可以访问子类的 public 成员
student.introduce();  // 可以调用子类的方法

本篇是TS基础用法,日常工作够用,下一篇整理其它高阶用法

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

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

相关文章

GPT对话代码库——STM32G431微秒(us)级delay函数

目录 1&#xff0c;问&#xff1a; 1&#xff0c;答&#xff1a; 方法一&#xff1a;使用定时器&#xff08;Timer&#xff09; 方法二&#xff1a;使用SysTick定时器 方法三&#xff1a;使用内联汇编 选择合适的方法 2&#xff0c;问&#xff1a; 2&#xff0c;答&…

如何集成CppCheck到visual studio中

1.CPPCheck安装 在Cppcheck官方网站下载最新版本1.70&#xff0c;官网链接&#xff1a;http://cppcheck.sourceforge.net/ 安装Cppcheck 2.集成步骤 打开VS&#xff0c;菜单栏工具->外部工具->添加&#xff0c;按照下图设置&#xff0c;记得勾选“使用输出窗口” 2.…

深入解析 IPython 命名空间与作用域机制

IPython 是一个强大的交互式 Python 解释器&#xff0c;它提供了许多增强的功能来改善用户的编程体验。在 IPython 中&#xff0c;命名空间&#xff08;namespace&#xff09;和作用域&#xff08;scope&#xff09;的概念对于理解变量的生命周期和访问方式至关重要。本文将详细…

word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法

问题描述&#xff1a;word2016中新建页面显示出来的页面没有页眉页脚&#xff0c;只显示正文部分。设置了页边距也不管用。 如图1 图1 解决&#xff1a; 点击“视图”——“多页”——“单页”&#xff0c;即可。如图2操作 图2 结果展示&#xff1a;如图3 图3

【Unity】数据持久化--JSON

1、JSON基础语法 1.1 注释内容 单行注释 // 多行注释 /* 内容 */ //注释内容 /* 多行注释 123 e1 ds */ /* 1.2 符号含义 大括号 {} 对象 中括号 [] 数组 冒号 : 键值对对应关系 逗号 , 数据分割 双引号 "" 键名/字符串 1.3 键值对表示 “ "键…

AI 大模型之美 | 更新完结

AI 大模型&#xff1a;技术的壮丽与美感 在当今的人工智能领域&#xff0c;大模型如同一座座巨大的桥梁&#xff0c;将计算机科学、语言学、认知科学等多个领域连接在一起。它们不仅仅是技术的象征&#xff0c;更是人类智慧与创新的结晶。本文将探讨AI大模型的壮丽与美感&…

基于Java的订餐小程序【附源码】

一、本选题的依据&#xff08;阐述所选课题的研究背景、研究目的和意义、分析国内外研究现状及趋势&#xff09; 研究背景&#xff1a; 随着移动互联网的普及和智能手机的发展&#xff0c;人们的生活方式正在发生深刻的变化。特别是在餐饮行业&#xff0c;传统的堂食模式已不能…

‘pip‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

【深度学习】快速入门KerasNLP:微调BERT模型完成电影评论情感分类任务

简介&#xff1a;本文将介绍 KerasNLP 的安装及使用&#xff0c;以及如何使用它在情感分析任务中微调 BERT 的预训练模型。 1. KerasNLP库 KerasNLP 是一个自然语言处理库&#xff0c;兼容 TensorFlow、JAX 和 PyTorch 等多种深度学习框架。基于 Keras 3 构建&#xff0c;这些…

核密度估计kde的本质

核密度估计的本质就是插值&#xff0c;不是拟合&#xff0c;只是不要求必须过已知点。 核为box窗函数 核为高斯函数

python利用cartopy绘制带有经纬度的地图

参考&#xff1a; https://makersportal.com/blog/2020/4/24/geographic-visualizations-in-python-with-cartopy https://scitools.org.uk/cartopy/docs/latest/ https://stackoverflow.com/questions/69465435/cartopy-show-tick-marks-of-axes 具体实现方式&#xff1a; …

201.回溯算法:全排列(力扣)

class Solution { public:vector<int> res; // 用于存储当前排列组合vector<vector<int>> result; // 用于存储所有的排列组合void backtracing(vector<int>& nums, vector<bool>& used) {// 如果当前排列组合的长度等于 nums 的长度&am…

【Android】软键盘空白问题

问题描述 A界面弹出软键盘&#xff0c;跳到B界面&#xff0c;然后返回A界面时软键盘出现空白 解决方案&#xff1a; A界面的onResume方法、跳B界面方法调用前&#xff0c;加一个清除输入框焦点的方法 if (editText!null){editText.clearFocus();}清单文件里A界面添加属性&…

Mybatis 到 MyBatisPlus

Mybatis 到 MyBatisPlus Mybatis MyBatis&#xff08;官网&#xff1a;https://mybatis.org/mybatis-3/zh/index.html &#xff09;是一款优秀的 持久层 &#xff08;ORM&#xff09;框架&#xff0c;用于简化JDBC的开发。是 Apache的一个开源项目iBatis&#xff0c;2010年这…

[亲测可用] 一行代码分页---springBoot PageHelper 不生效解决方案!!

今天做mybatis查询的时候 不管是用框架查询sql还是手动写sql&#xff0c;查询分页都不生效&#xff0c;很简单&#xff0c;你配置不对&#xff0c;或者缺少了配置。我下面是直接配置 不用写代码配置。框架查询sql还是手动写sql都支持 这是我查询的sql (注意&#xff01;&#…

【图像处理实战】去除光照不均(Python)

这篇文章主要是对参考文章里面实现一种小拓展&#xff1a; 可处理彩色图片&#xff08;通过对 HSV 的 V 通道进行处理&#xff09;本来想将嵌套循环改成矩阵运算的&#xff0c;但是太麻烦了&#xff0c;而且代码也不好理解&#xff0c;所以放弃了。 代码 import cv2 import …

虚拟化 之八 详解构造带有 jailhouse 的 openEuler 发行版(ARM 飞腾派)

基本环境 嵌入式平台下,由于资源的限制,通常不具备通用性的 Linux 发行版,各大主流厂商都会提供自己的 Linux 发行版。这个发行版通常是基于某个 Linux 发行版构建系统来构建的,而不是全部手动构建,目前主流的 Linux 发行版构建系统是 Linux 基金会开发的 Yocto 构建系统。…

【大数据技术原理与应用(概念、存储、处理、分析与应用)】第3章-分布式文件系统HDFS习题与知识回顾

文章目录 单选题多选题知识回顾什么是HDFS?分布式文件系统结构HDFS的设计目标与局限性块的概念名称节点(NameNode)数据节点(DataNode)第二名称节点HDFS体系结构的局限性HDFS存储原理冗余存储数据存取策略数据读取策略HDFS数据读写过程读数据的过程写数据的过程单选题 1、分…

用一个暑假|用AlGC-stable diffusion 辅助服装设计及展示,让你在同龄人中脱颖而出!

大家好&#xff0c;我是设计师阿威 Stable Diffusion是一款开源AI绘画工具&#xff0c; 用户输入语言指令&#xff0c;即可自动生成各种风格的绘画图片 Stable Diffusion功能强大&#xff0c;生态完整、使用方便。支持大部分视觉模型上传&#xff0c;且可自己定制模型&#x…

C++ boost::property_tree::read_json读取虚拟墙文件

输入是一个json文件如下 VirtualWall.json {"LAYERSUM":1,"LAYER":[{"LAYERNUM":0,"LINESUM":23,"LINE":[{"BEGIN":{"X":-3028.6428,"Y":-10671.736},"END":{"X":-3167…