学习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,一经查实,立即删除!

相关文章

如何集成CppCheck到visual studio中

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

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

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

AI 大模型之美 | 更新完结

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

‘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…

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年这…

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

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

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

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

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

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

什么是大模型?一文读懂大模型的基本概念

大模型是指具有大规模参数和复杂计算结构的机器学习模型。本文从大模型的基本概念出发&#xff0c;对大模型领域容易混淆的相关概念进行区分&#xff0c;并就大模型的发展历程、特点和分类、泛化与微调进行了详细解读&#xff0c;供大家在了解大模型基本知识的过程中起到一定参…

win7 的 vmware tools 安装失败

没有安装vmware tools的系统屏幕显示异常。桌面是比较小的图像&#xff0c;四周是黑边在 vmware 软件里 方法1&#xff0c;下补丁 https://www.catalog.update.microsoft.com/Search.aspx?qkb4474419 方法2&#xff0c;使用老版vm tools http://softwareupdate.vmware.com/c…

【ARM】MDK工程切换高版本的编译器后出现error A1137E报错

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决工程从Compiler 5切换到Compiler 6进行编译时出现一些非语法问题上的报错。 2、 问题场景 对于一些使用Compiler 5进行编译的工程&#xff0c;要切换到Compiler 6进行编译的时候&#xff0c;原本无任何报错警告…

各大广告商竞相厮杀下,诞生了一个偏门的副业方式

前段时间&#xff0c;想买摩托车&#xff0c;但是媳妇不让买&#xff0c;所以我打算偷偷买&#xff0c;然后萌生了去摆摊赚钱的想法&#xff0c;但是还没有实施就在网上接触到了“某赚”APP&#xff0c;于是一发不可收拾&#xff0c;用我的话来说&#xff0c;我做的不是副业&am…

佑驾创新A股夭折再冲港股:三年亏损超5亿,商业化盈利难题何解

《港湾商业观察》廖紫雯 日前&#xff0c;深圳佑驾创新科技股份有限公司&#xff08;以下简称&#xff1a;佑驾创新&#xff09;递表港交所&#xff0c;保荐机构为中信证券、中金公司。佑驾创新曾于2023年8月启动A股上市辅导&#xff0c;但2024年5月公司终止了与辅导机构的上市…

【ai】trition:tritonclient yolov4:部署ubuntu18.04

X:\05_trition_yolov4_clients\01-python server代码在115上,client本想在windows上, 【ai】trition:tritonclient.utils.shared_memory 仅支持linux 看起来要分离。 client代码远程部署在ubuntu18.04上 ubuntu18.04 创建yolov4-trition python=3.7 环境 (base) zhangbin@ub…

基于matlab的图像灰度化与图像反白

1原理 2.1 图像灰度化原理 图像灰度化是将彩色图像转换为灰度图像的过程&#xff0c;使得每个像素点仅包含一个灰度值&#xff0c;从而简化了图像的复杂度。灰度化原理主要可以分为以下几种方法&#xff1a; 亮度平均法 原理&#xff1a;将图像中每个像素的RGB值的平均值作为…

[深度学习] 生成对抗网络GAN

生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;GANs&#xff09;是一种由 Ian Goodfellow 等人在2014年提出的深度学习模型Generative Adversarial Networks。GANs的基本思想是通过两个神经网络&#xff08;生成器和判别器&#xff09;的对抗过程&#…