Typescript学习(第三弹)

news2024/10/7 7:33:19

泛型

定义

不预先确定的数据类型,具体的类型在使用的时候才确定,把泛型理解为代表类型的参数

泛型函数

泛型函数类型

泛型接口

引用泛型接口要指定一个类型,否则会报错

或者在泛型接口里指定一个默认类型

泛型类

  • 泛型放在类的后面这样可以约束类的成员

  • 泛型不能应用于类的静态成员

  • 实例化泛型类

    • 实例化的时候可以显式的传入T的类型,那这个实例化再调用方法就会受到泛型的约束

    • 实例化的时候也可以不传入类型,这样实例化再调用的方法就可以传任意值

泛型约束

如果你顶一个一个函数函数,要直接调用一个length属性是会报错的

这个时候可以定义一个Length的类型接口,让T继承Length接口,这样T就受到了约束,T就一定会有Length的属性

这个时候函数输入的参数也必须有length属性

泛型的好处

  • 函数和类可以轻松的支持多种类型,增强程序的扩展性
  • 不必写多条函数重载,冗长的联合类型声明,增强代码可读性
  • 灵活控制类型之间的约束

类型检查机制

  • 定义:Typescript 编译器在做类型检查时,所秉承的一些原则,以及表现出的一些行为。
  • 作用:辅助开发,提高开发效率

类型推断

  • 不需要指定变量的类型(函数的返回值类型),Typescript可以根据某些规则自动的为其推断出一个类型

基础类型推断

  • 初始化变量
  • 设置函数默认参数
  • 确定函数返回值

最佳通用类型推断

  • 推断出一个可以兼容当前所有类型的通用类型

上下文类型推断

  • 根据事件绑定推断出事件类型

类型断言

  • 定义:用自己声明的类型覆盖类型推断

    可以自己定义一个接口,用as添加断言

类型兼容性

定义

  • 当一个类型Y可以被赋值给另一个类型X的时候,我们就可以说类型X兼容Y

  • X兼容Y:X(目标类型) = Y(源类型)

接口兼容性:

  • 成员少的兼容成员多的(鸭式辩型法)

函数兼容性

  • 参数个数:目标函数多于源函数

  • 可选参数和剩余参数

    • 固定参数可以兼容可选参数和剩余参数;
    • 可选参数不兼容固定参数和剩余参数(严格模式下,也可以在tsconfig里面修改配置);
    • 剩余参数兼容固定参数和可选参数
  • 参数类型:必须匹配

    • 但是参数如果是对象:成员多的会兼容成员少的(严格模式下);相互兼容(非严格模式,可以在tsconfig里面修改配置),也叫函数参数的双向协变
  • 返回值类型:目标函数必须与原函数相同,或为其子类型

枚举兼容性

  • 枚举类型和数字类型互相兼容
  • 枚举类型之间不兼容

类的兼容性

  • 静态成员和构造函数不在比较范围
  • 两个类具有相同的实例成员, 它们的实例相互兼容
  • 类中包含私有成员或受保护成员,只有父类和子类的实例相互兼容

泛型兼容性

  • 泛型接口:只有类型参数T 被接口成员使用时,才会影响兼容性

  • 泛型函数:定义相同,没有指定类型参数时就兼容

记忆口诀:

  • 结构之间兼容:成员少的兼容成员多的
  • 函数之间兼容:参数多的兼容参数少的

类型保护

  • 定义:在特定的区块中保证变量属于某种确定定的类型

创建区块的方法

  • instanceof :用instanceof来判断是否实例

  • typeof

  • in:用in来判断属性是否存在

  • 类型保护函数 特殊的返回值:arg is type(类型谓词)

高级类型

交叉类型(类型并集)

  • 含义:将多个类型合并为一个类型,新的类型将具有所有类型的特性
  • 应用场景:混入
    用&连接,取两个接口的并集

联合类型(类型交集)

  • 含义:类型并不确定,可能为多个类型中的一个
  • 应用场景:多类型支持
    • 对象联合类型,取对象方法的交集
  • 可区分的联合类型:结合联合类型和字面量类型的类型保护方法

字面量类型

  • 字符串字面量
  • 数字字面量
  • 应用场景:限定变量取值范围

索引类型

要点

  • keyof T(索引查询操作符) 类型T公共属性名的字面量联合类型
  • TK:对 象T的属性 K所代表的类型
  • 泛型约束

应用场景:

  • 从一个对象中选取某些属性的值

映射类型

  • 含义:从旧类型创建出新类型

应用场景

同态:只作用于T的属性

  • Readonly:将T的 所有属性变为只读
  • Partial:将T的所有 有属性变为可选
  • Pick<T,K>:选取以K光为属性的对象T的子集

  • Record<K,T>:创新属性为K的新对象,属性值的类型为T

条件类型

  • 含义:T extendsU?X:Y(如果类型T可以赋值给类型 U,那么结果类型就是X,否则就是 Y)

应用场景

  • Exclude<T,U>:从T中 过滤掉可以赋值给U的类型
  • Extract<T,U>:从T中抽取出可以赋值给U的类型
  • NonNullable:从T口中除去 undefined 和 null
  • ReturnType:获取函数的返回值类型
  // T extends U ? X : Y

type TypeName<T> =
    T extends string ? "string" :
    T extends number ? "number" :
    T extends boolean ? "boolean" :
    T extends undefined ? "undefined" :
    T extends Function ? "function" :
    "object";
type T1 = TypeName<string>
type T2 = TypeName<string[]>

// (A | B) extends U ? X : Y
// (A extends U ? X : Y) | (B extends U ? X : Y)
type T3 = TypeName<string | string[]>

type Diff<T, U> = T extends U ? never : T
type T4 = Diff<"a" | "b" | "c", "a" | "e">
// Diff<"a", "a" | "e"> | Diff<"b", "a" | "e"> | Diff<"c", "a" | "e">
// never | "b" | "c"
// "b" | "c"

type NotNull<T> = Diff<T, null | undefined>
type T5 = NotNull<string | number | undefined | null>

// Exclude<T, U>
// NonNullable<T>

// Extract<T, U>
type T6 = Extract<"a" | "b" | "c", "a" | "e">

// ReturnType<T>
type T8 = ReturnType<() => string>
  

总结

Typescript的基础分成了三篇,可以查看相关文章合集来巩固一下,再结合费曼学习法,加强记忆哦~

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

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

相关文章

项目上线后我是如何通过慢查询和索引让系统快起来的

1、前言 最近对mysql的操作比较多一些&#xff0c;主要是项目上线以后&#xff0c;难免会有一些数据上的问题。开始的时候还主要由后端来处理&#xff0c;后面数据问题确实比较多&#xff0c;于是我就找后端要来服务器的账号密码&#xff0c;连上数据库顺便来看看数据的问题。…

C语言小项目-----员工管理系统

目录 项目要求&#xff1a; 考虑点&#xff1a; 实现过程 所用知识点 最终效果如下&#xff1a; 项目要求&#xff1a; 考虑点&#xff1a; 服务器端用select监听多个客户端&#xff0c;考虑点在于&#xff0c;公司内部的系统管理系统&#xff0c;不会有太多人每天都登陆&a…

【web前端开发】CSS的元素显示模式

前言 元素的显示模式可以更好的帮助我们布局页面,了解元素的显示模式,可以让我们布局页面时更加简单清晰 什么是元素显示模式 元素显示模式就是元素(标签)以什么样的方式进行显示 HTML元素一般分为块元素和行内元素两种类型 以下是块级元素和行内元素在网页中的显示: 块元…

3.神经网络-深度学习入门

3.神经网络 深度学习入门 本文的文件和代码链接&#xff1a;github地址 1.激活函数 sigmoid h(x)11e−xh(x) \frac{1}{1 e^{-x}} h(x)1e−x1​ def sigmod(x):return 1 / (1 np.exp(-1 * x))ReLU h(x){x:x>00:x≤0h(x) \left\{ \begin{array}{lr} x & : x > …

CMake静态库和动态库构建实例

任务 建⽴⼀个静态库和动态库&#xff0c;提供 HelloFunc 函数供其他程序编程使⽤&#xff0c;HelloFunc 向终端输出 Hello World 字 符串。安装头⽂件与共享库。 构建过程 构建动态库 目录结构 jyhlinuxubuntu:~/share/makefile_cmake/cmake01$ tree . ├── build #在…

m基于多用户MIMO系统的分布式可重构注水算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 在单用户MIMO场景中&#xff0c;空间复用技术能够带来高数据速率的传输&#xff0c;但是也需要一些前提条件&#xff0c;比如发射端的预编码或者接收端的信道估计与信号检测。然而&#xff0c;在…

java项目-第169期ssm二手交易平台网站-ssm毕业设计_计算机毕业设计

java项目-第169期ssm二手交易平台网站-ssm毕业设计 【源码请到下载专栏下载】 《ssm二手交易平台网站》 该项目分为3个角色&#xff0c;管理员、用户、商家。 用户可以浏览前台商品并且进行购买。在个人后台可以看到自己的商品。 商家可以对商品进行商品分类管理、商品信息管理…

React 学习笔记:组件通信

组件通信 组件为什么需要通信呢&#xff1f;这是因为组件是独立且封闭的单元&#xff0c;默认情况下&#xff0c;组件只能使用自己的数据&#xff0c;但是多个组件之间不可避免的要共享某些数据&#xff0c;为了实现这些功能&#xff0c;就需要打破组件的独立封闭性&#xff0…

深度学习入门(五十九)循环神经网络——通过时间反向传播

深度学习入门&#xff08;五十九&#xff09;循环神经网络——通过时间反向传播前言循环神经网络——通过时间反向传播教材1 循环神经网络的梯度分析1.1 完全计算1.2 截断时间步1.3 随机截断1.4 比较策略2 通过时间反向传播的细节3 小结前言 核心内容来自博客链接1博客连接2希…

基于java+springboot+vue+mysql的甜品蛋糕销售商城网站

项目介绍 随着社会的快速发展&#xff0c;计算机的影响是全面且深入的。人们生活水平的不断提高&#xff0c;日常生活中用户对网上蛋糕商城方面的要求也在不断提高&#xff0c;网上蛋糕商城得到广大用户的青睐&#xff0c;使得网上蛋糕商城的开发成为必需而且紧迫的事情。本系…

Docker笔记--使用数据卷实现容器与宿主机的数据交互

1--数据卷的介绍和作用 在 Docker 架构中&#xff0c;宿主机系统和容器之间不能直接传递数据&#xff0c;同时当容器被删除时&#xff0c;容器所有的数据都会被清除&#xff1b; 数据卷能够在宿主机与容器、容器与容器之间搭建数据传输和共享的通道&#xff0c;当容器内的目录与…

C++ 快速复习-数据类型

内置数据类型 int、unsigned int 、long、unsigned long 、short、char、signed char、bool、 long long float、double、long double 等 无符号的数据类型 主要在于 不在区分 -&#xff0c;数据波动范围变大。另外&#xff0c;值得注意的是 unsigned 类型的数据 不建议在输出…

玩以太坊链上项目的必备技能(变量作用域-Solidity之旅五)

在前文我们讲过 Solidity 是一种静态类型的语言&#xff0c;这就意味着在声明变量前需先指定类型。 而 Solidity 对变量划分了以下三种作用域范围&#xff1a; 状态变量&#xff08;State Variable&#xff09;&#xff1a; ​ 该变量的值被永久地存放在合约存储中&#xff…

JS新年倒计时

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;前端案例分…

Java---线程详解

目录 一、线程的介绍 二、线程的使用 &#xff08;1&#xff09;多线程的实现 1&#xff1a;继承Thread类 2&#xff1a;实现Runnable接口 &#xff08;2&#xff09;设置和获取线程名称 1:继承Thread类 2&#xff1a;实现Runnable接口 &#xff08;3&#xff09;线程…

Java学习—多线程Thread

多线程1. 线程简介1.1 普通方法和多线程1.2 程序、进程、线程2. 线程创建2.1 Thread类案例&#xff1a;下载图片2.2 Runnable接口案例&#xff1a;龟兔赛跑2.3 Callable接口3. 静态代理4. Lamda表达式5. 线程状态5.1 线程方法5.2 停止线程5.3 线程休眠5.4 线程礼让-yield5.5 Jo…

揭秘SpringMVC-DispatcherServlet之九大组件(二)

前言 上回聊到了HandlerAdapter&#xff0c;今天继续聊后面的组件。今天的主角是HandlerMapping&#xff0c;这篇文章全为他服务了。 HandlerMapping 上回说的Handler&#xff0c;我们说是处理特定请求的。也就是说&#xff0c;不是所有的请求都能处理。那么问题来了&#x…

gateway初始化与配置

1、排除依赖 spring-boot-starter-webflux 2、添加依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency><groupId>org.springf…

基于GDAL的JAVA生成GDB文件实战

前言 在之前博客中&#xff0c;陆续的介绍了关于gdb文件的读取&#xff0c;gis利器之Gdal&#xff08;三&#xff09;gdb数据读取&#xff0c;玩转GDAL一文带你深入Windows下FileGDB驱动支持&#xff0c;这些文章主要都是介绍gdal的读取gdb以及简单的gdb文件读写。在实际工作中…

VJ个人周赛

A:模拟 题意&#xff1a;给定了N个任务&#xff0c;每个任务都有一个优先级&#xff08;1~9&#xff09;&#xff0c;数字越大&#xff0c;优先级越高。将这些任务放入队列中&#xff0c;如果出队的元素&#xff08;x&#xff09;&#xff0c;x的优先级不是最高的&#xff0c;那…