学习TS看这一篇就够了!

news2024/11/18 9:43:42

目录

    • 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]   // ok

const 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:string
  age?: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.coloradmin.cn/o/1864145.html

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

相关文章

优思学院|做工厂的意义是什么?如何管理好一个工厂?

工厂的意义是什么&#xff1f;工厂是让物品增加附加价值的地方。既然使用地球上有限的资源进行生产&#xff0c;工厂就不能浪费这些有限的资源。 什么是附加价值&#xff1f;有人说做菜像变魔术。确实&#xff0c;原本不能食用的食材&#xff0c;经过厨师巧手烹调就能变成美味…

SaaS 出海:Databend Cloud 的定位与实践

提到 “SaaS 出海”这个词大家肯定并不陌生&#xff0c;SaaS 企业将业务拓展到海外市场已经成为许多 SaaS 公司的重要战略方向。随着企业对于灵活性、可扩展性以及成本效益需求的不断增长&#xff0c; SaaS 模式提供了理想的解决方案。对于寻求出海机会的 SaaS 企业来说&#x…

探索Uptime命令:Linux系统管理员的必备工具

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 探索Uptime命令&#xff1a;Linux系统管理员的必备工具 前言基本用法语法输出示例输出字段解释系…

【Web服务与Web应用开发】【C#】创建第一个简单的WCF服务应用程序 WCF Service Application(图文详情)

目录 0.简介 1.环境 2.知识点 3.详细过程 1&#xff09;打开 Visual Studio 2019 &#xff0c;下载所需插件 2&#xff09;创建WCF服务应用项目 3&#xff09;打开 【IService1.cs 】在此处定义服务函数 4&#xff09;打开 【Service1.svc.cs】实现服务函数 5&#x…

前端-echarts tooltip展示多项自定义数据

效果如图&#xff0c;鼠标滑动到某一个柱子的时候&#xff0c;出现这一项数据的多个自定义数据&#xff0c;外加自己的模板样式渲染。 希望能展示每一列中的多个自定义数据 代码部分 主要是在data中&#xff0c;value就是实际展示的主数据&#xff0c;其他字段名为自定义的数…

【小白学Python】AI生成图片(四)

【小白学Python】自定义图片的生成&#xff08;一&#xff09; 【小白学Python】自定义图片的生成&#xff08;二&#xff09; 【小白学Python】爬取数据&#xff08;三&#xff09; 目录 ai文生图接口的获取python中调用ai接口图片拼接先将图片缩放拼接图片 文字背景图代码效…

怎么压缩pdf文件大小,如何压缩pdf文件大小

pdf文件怎么压缩&#xff1f;在当下这个信息爆炸的时代&#xff0c;无论是在工作场所还是校园中&#xff0c;我们经常会面临需要处理大文件的情况&#xff0c;而PDF格式作为一种保留文档结构和布局完整性的理想选择&#xff0c;有时候pdf文件太大&#xff0c;因此&#xff0c;对…

汽车汽配图纸管理、产品研发管理解决方案

汽车汽配图纸管理、产品研发管理解决方案 随着全球汽车市场的快速发展&#xff0c;中国汽车汽配行业迎来了前所未有的发展机遇。然而&#xff0c;在这一过程中&#xff0c;企业也面临着诸多挑战&#xff0c;如研发能力的提升、技术资料管理的复杂性、以及跨部门协作的困难等。为…

ubuntu22.04速装中文输入法

附送ubuntu安装chrome wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i google-chrome-stable_current_amd64.deb

动画重定向——当给一个人物模型用别人物的动画时,会遇到人物与动画不匹配问题,怎么解决呢?

每日一句&#xff1a;实践出真知&#xff0c;试错方确信 目录 最开始我想的原因&#xff01; 分析一下动画相关参数 Animator组件参数详解&#xff1a; 人物模型的导入设置参数&#xff1a; Skinned Mesh Renderer组件详解: Skinned Mesh Renderer工作原理 设置Skinned …

【STM32CubeIDE】硬件IIC+AHT20使用

前言 本文主要介绍STM32CubeIDE配置硬件IIC驱动AHT20模块&#xff0c;实现温湿度读取并用串口打印显示在上位机&#xff1b; 软件平台&#xff1a;STM32CubeIDEHAL库 硬件环境&#xff1a;STM32F103ZET6(正点原子战舰V3)AHT20模块 目录 前言AHT20简介软件程序CubeIDE设置AHT2…

ChatGPT/AI助力学术写作-辅助翻译及润色

Nature期刊中的Career column专栏在4月份的时候发表了关于Chatgpt帮助学术写作的几点建议。 一、Three ways ChatGPR helps me in my academic writing 1、优化学术写作 不管使用哪一种AI工具&#xff0c;精确清晰的指令可以帮助使用者得到更好的反馈。例如&#xff1a;I’m w…

【LINUX】内核源码文件系统调用相关摸索

首先&#xff0c;先看看想测试那个系统调用&#xff0c;在应用层&#xff0c;如果使用C语言编程一般我们一来就是open函数&#xff0c;实际在测试的时候&#xff0c;直接用touch xxx.txt然后 echo "xxx" >> xxx.txt&#xff0c;这样就完成了文件创建和写文件的…

MemManage_Handler 问题的解决思路

1、问题 在做一个安全类项目时发现&#xff0c;软件在运行一段时间后会进入"MemManage_Handler",遂开始了一系列查找。 2、解决 &#xff08;1&#xff09;查看堆栈数据 查堆栈的数据&#xff0c;发现堆栈也被破坏了&#xff0c;看不出来是执行哪个任务执行导致的…

零基础想学编程,选择哪一门语言更好就业?(非常详细)零基础入门到精通,收藏这一篇就够了_c#就业方向

编程语言的用途广泛&#xff0c;它们各自在不同的领域和应用场景中发挥着重要作用。 零基础初学者在选择编程语言时&#xff0c;可以从就业方向入手选择。 【一一帮助安全学习&#xff0c;所有资源获取处一一】 ①网络安全学习路线 ②20份渗透测试电子书 ③安全攻防357页笔记 …

基于Java微信小程序同城家政服务系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

为什么每一名程序员都应该学习 C++?

掌握 C 可不容易&#xff0c;但一旦你掌握了&#xff0c;就会获得丰厚的回报。 通常&#xff0c;程序员在他们的编程生涯中会使用多种编程语言。然而&#xff0c;我们也看到&#xff0c;有些程序员一直在使用同一种编程语言。例如&#xff0c;我们经常遇到有几十年经验的 Java…

day50---数据结构与算法(五)

四. 高级数据结构与算法设计 4.1 图 1) 概念 图是由顶点&#xff08;vertex&#xff09;和边&#xff08;edge&#xff09;组成的数据结构&#xff0c;例如 #mermaid-svg-bv3SYpkStIeixcO2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;…

从灵感到成品:使用AI生成博客文章的完整指南

在信息爆炸的时代&#xff0c;每个人都有讲述自己故事的权利和需求。博客作为一种表达方式&#xff0c;不仅能记录个人经历&#xff0c;还能分享知识和观点。然而&#xff0c;许多人在写博客文章时&#xff0c;常常会遇到灵感枯竭、时间不够用或者不知道如何开始等问题。幸运的…

还不到6个月,GPTs黄了

相比起来&#xff0c;人们还不如使用一个足够强大、灵活且通用的AI助手来满足各类复杂需求。更严重的是一些独立GPTs显露出的安全隐患。除此之外&#xff0c;最大的问题在于OpenAI模糊不清的货币化政策。 文章正文 上周&#xff0c;不少人发现微软官网忽然更新了一条“GPT Bu…