深入学习TS的高阶语法(泛型、类型检测、内置工具)

文章目录

    • 概要
    • 一.TS的类型检测
      • 1.鸭子类型
      • 2.严格的字面量类型检测
    • 二.TS的泛型
      • 1.基本使用
      • 2.传递多个参数
      • 3.泛型接口
      • 4.泛型类
      • 5.泛型约束
      • 6.映射类型(了解)
    • 三.TS的知识扩展
      • 1.模块的使用
        • -- 内置类型导入
      • 2.类型的查找
      • 3.第三方库的类型导入
      • 4.declare 声明文件
      • 5.内置工具
    • 小结

概要

本文主要深入学习TS的高阶语法,对TS的类型检测机制进行分析得知TS类型检测机制是鸭子模型,对TS的重点泛型进行学习,最后学习TS的部分内置工具

一.TS的类型检测

1.鸭子类型

  • 如果一只鸟看起来像鸭子、游泳像鸭子、叫声像鸭子,那么这只鸟就可以被称为鸭子
  • 即只关心属性和方法,不关心是不是对应的类型
class Person {constructor(public name: string, public age: number){this.name = namethis.age = age}
}// 限制参数类型是Person类
function fn(arg: Person){}fn(new Person('wuu', 20))// 不会报错,因为根据鸭子类型
// {name: "wuu", age: 20}有Person类对应的属性和方法
fn({name: "wuu", age: 20})

2.严格的字面量类型检测

 每个对象字面量最初都被认为是“新鲜的(fresh)”。

 当一个新的对象字面量分配给一个变量或传递给一个非空目标类 型的参数时,对象字面量指定目标类型中不存在的属性是错

​ 误的。

 当类型断言或对象字面量的类型扩大时,新鲜度会消失。

 新鲜度消失后,不再进行类型检测。

二.TS的泛型

1.基本使用

  • 定义参数来使用

这里我们可以使用两种方式来调用它:

​  方式一:通过 <类型> 的方式将类型传递给函数;

​  方式二:通过类型推导(type argument inference),自动 推到出我们传入变量的类型:

​ ✓ 在这里会推导出它们是 字面量类型的,因为字面量类型对 于我们的函数也是适用的

// 定义了一个泛型T
function fn<T>(item: T){console.log(item);
}// 使用方式
// 1. 通过<类型> 的方式将类型传递给函数;
// 给泛型T,指明类型是字符串
fn<string>('1')// 2.通过类型推导,自动推到出我们传入变量的类型:
fn(1)

2.传递多个参数

平时在开发中我们可能会看到一些常用的名称:

​  T:Type的缩写,类型

​  K、V:key和value的缩写,键值对

​  E:Element的缩写,元素

​  O:Object的缩写,对象

interface IObj<T, N> {name: Tage: Nslogan: T
}const obj: IObj<string, number> = {name: 'wuu',age: 20,slogan: '哈哈哈'
}

3.泛型接口

interface IObj<T, N> {name: Tage: Nslogan: T
}const obj: IObj<string, number> = {name: 'wuu',age: 20,slogan: '哈哈哈'
}

4.泛型类

class Person<T> {constructor(public _name: T){this._name = _name}}const p = new Person<string>('wuu')export{}

5.泛型约束

有时候我们希望传入的类型有某些共性,但是这些共性可能不是在同一种类型中:

​  比如string和array都是有length的,或者某些对象也是会有 length属性的;

​  那么只要是拥有length的属性都可以作为我们的参数类型,那 么应该如何操作呢?

/* 实现方法一 */
interface ILength {length: number
}// 通过继承,这样就限制必须有length属性
// 因为泛型通过类型推导,此时item传递过来的类型就是参数的类型
function fn<T extends ILength>(item: T){return item
}
// 类型: const res1: "哈哈哈"
const res1 = fn('哈哈哈')/* 实现方法二: */
// item的类型被写死成ILength了
function fn1(item: ILength) {return item
} // 类型:const res2: ILength
const res2 = fn1('哈哈哈')

在泛型约束中使用类型参数

​  你可以声明一个类型参数,这个类型参数被其他类型参数约 束;

举个栗子:我们希望获取一个对象给定属性名的值

​  我们需要确保我们不会获取 obj 上不存在的属性;

​  所以我们在两个类型之间建立一个约束;

/* 实现方法一 */
interface IType {name: stringage: number
}// 此时传递的参数只能是IType类型的key值
// 相当于是把key的值变成联合类型继承给了T
function fn<T extends keyof IType>(item: T){return item
}const res1 = fn('name')

6.映射类型(了解)

三.TS的知识扩展

1.模块的使用

我们需要先理解 TypeScript 认为什么是一个模块。

​  JavaScript 规范声明任何没有 export 的 JavaScript 文件都应 该被认为是一个脚本,而非一个模块。

​  在一个脚本文件中,变量和类型会被声明在共享的全局作用域 将多个输入文件合并成一个输出文件,或者在 HTML使用多

如果你有一个文件,现在没有任何 import 或者 export,但是你希望它被作为模块处理,添加这行代码:

export {}
– 内置类型导入
  • TS中可以支持单类型导入

◼ 你需要使用 type 前缀 ,表明被导入的是一个类型

import type {IType} from './01.ts的基本使用'const obj: IType = {name: 'wu',age: 19
}

2.类型的查找

  • .d.ts文件
  • 里面只放类型声明文件,不能写逻辑代码

3.第三方库的类型导入

  • 例如使用react时,react没有对应的 .d.ts文件,所以需要下载对应的类型文件
  • 在npm已经有了对应的提示
  • 根据提示去下载对应的包

4.declare 声明文件

  • 在使用ts时,ts可能不认识我们要导入的文件

     比如在开发vue的过程中,默认是不识别我们的.vue文件的

     比如在开发中我们使用了 jpg 这类图片文件,默认typescript也是不支持的

     比如导入的第三方库没有对应的类型声明

// 可以加大括号,大括号里面是这个文件里有什么东西
declare module '*.vue' declare module '*.jpg'
declare module '*.png'

5.内置工具

  • Partial

    用于构造一个Type下面的所有属性都设置为可选的类型

  • Required

    ◼ 用于构造一个Type下面的所有属性全都设置为必填的类型,这个工具类型跟 Partial 相反。

  • Readonly

    用于构造一个Type下面的所有属性全都设置为只读的类型,意味着这个类型的所有的属性全都不可以重新赋值。

  • Record<Keys, Type>

    用于构造一个对象类型,它所有的key(键)都是Keys类型,它所有的value(值)都是Type类型。

  • Pick<Type, Keys>

    ◼ 用于构造一个类型,它是从Type类型里面挑了一些属性Keys

  • Omit<Type, Keys>

    用于构造一个类型,它是从Type类型里面过滤了一些属性Keys

  • Exclude<UnionType, ExcludedMembers>

    用于构造一个类型,它是从UnionType联合类型里面排除了所有可以赋给ExcludedMembers的类型。

  • Extract<Type, Union>

    用于构造一个类型,它是从Type类型里面提取了所有可以赋给Union的类型。

  • NonNullable

    用于构造一个类型,这个类型从Type中排除了所有的null、undefined的类型

  • ReturnType

    用于构造一个含有Type函数的返回值的类型。

  • InstanceType

    用于构造一个由所有Type的构造函数的实例类型组成的类型。

小结

本文主要深入学习TS的高阶语法,对TS的类型检测机制进行分析得知TS类型检测机制是鸭子模型,对TS的重点泛型进行学习,最后扩展部分内置工具
由于作者水平有限
如果对本文有任何疑问可以私信或者评论区发表你的看法
本文如果对你有帮助,麻烦点个赞和收藏方便回看,点点关注 谢谢

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

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

相关文章

【单片机】使用AD7606+AD698芯片读取RVDT角位移

接上文&#xff0c;经过第一阶段的AD2S1210测量旋转变压器的角位移之后&#xff0c;现在用AD698来进一步的加强验证&#xff0c;目前网上有关于这方面的研究资料还是挺少的。   AD698是美国ADI公司生产的单片式线性位移差分变压器信号调节系统。将AD698与RVDT&#xff0f;LVD…

ctfshow MISC 2023愚人杯做题笔记

2023愚人杯 1.奇怪的压缩包 下载的题目压缩包是ZIP伪加密&#xff0c;修改后&#xff0c;解开得一个图片文件black.png。使用01编辑器打开&#xff0c;发现尾部有一个压缩包。 把尾部的压缩包另存后&#xff0c;发现该压缩包为加密包。再用01打开&#xff0c;发现尾部有一个b…

日常工作软件安装总结

日常工作软件安装总结 系统服务安装集成 Skywalking SpringBoot集成Skywalking服务 地址&#xff1a;http://192.168.1.52:8686/general nohup java -javaagent:/mnt/skywalking-agent/skywalking-agent/skywalking-agent.jar -DSW_AGENT_NAMEdev::rms-risk-service agent…

Web Serial API串口通信,实现web和electron扫码枪读取数据

文章目录 前言一、Serial API是什么&#xff1f;二、API使用步骤1.navigator.serial.requestPort()2.port.open(options)3.reader.read()4.port.close()其他常见API:完整代码 三、electron使用 前言 本文将讲述Web Serial API简单应用&#xff0c;以扫码枪为示例&#xff0c;通…

idea查找所有未使用的代码

1.背景 最近在做无用代码下线的时候发现一个方法里会引用很多个方法&#xff0c;一旦该方法删除以后&#xff0c;里面被引用的方法应该也一同下线&#xff0c;但是一个一个的找过去比较耗费精力&#xff0c;下面给大家推荐一个idea自带的代码分析工具 2.代码分析工具 Code-&…

【无标题】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘

项目场景&#xff1a; 做单链表反转题目&#xff0c;报错&#xff1a;member access within null pointer of type ‘struct ListNode’ 题目链接:LINK 问题描述 我明明在初始化指针时候&#xff0c;已经处理了n2->next情况却依然报错 这个报错提示含义是&#xff1a;大概就…

创新性3D数据合成模型,微软推出EgoGen

随着AR、VR等设备的广泛应用,第一人称的应用开始增多。但在研发方面面临不同的挑战,例如&#xff0c;图像模糊、视觉混乱、遮挡更严重等&#xff0c;给视觉模型的训练带来重大挑战。 一方面,人工标注真实第一视角数据集&#xff0c;来培训深度学习模型的成本和难度都很高。另一…

第八章 shell编程之sed

目录 1.1. 概念 1.1.1. 工作原理&#xff1a; 1.2. 基本语法 1.2.1. 格式 1.2.2. 参数 1.2.3. 定址符 1.2.4. 操作 1.3. 输出文本 1.3.1. 范例文件&#xff1a; 1.3.2. 示例 1.4. 文本替换 1.4.1. 范例文件 1.4.2. 格式&#xff1a; 1.4.3. 示例 1.5. 删除文本 …

提升生产能力的必备工具——MES系统自动排产

在现代制造业中&#xff0c;生产能力的提升对企业发展至关重要。随着市场竞争的日益激烈&#xff0c;企业不仅需要提高产品质量&#xff0c;还需要提高生产效率。而MES系统自动排产作为一种先进的生产管理工具&#xff0c;可以帮助企业高效地安排生产&#xff0c;实现生产能力的…

江科大stm32学习笔记——【3-2】GPIO输出:LED闪烁LED流水灯蜂鸣器

&#xff08;一&#xff09; 硬件连接 1.LED闪烁 LED灯正极连接面包板电源正极&#xff0c;LED负极连接单片机A0口 (也可以LED负极连面包板负极&#xff0c;LED正极连接单片机A0口) 跳线连接单片机3.3和面包板正极&#xff0c;连接单片机GND和面包板负极 2.LED流水灯 3.蜂鸣…

你并不了解 JavaScript:入门 - 第二版 - 第二章:JS 概观

第二章&#xff1a;JS 概观 学习 JS 的最好方法就是开始写 JS。 要做到这一点&#xff0c;你需要知道这门语言是如何工作的&#xff0c;而这正是我们在这里要重点讨论的。即使你以前用过其他语言编程&#xff0c;也要慢慢适应 JS&#xff0c;并确保练习每一块。 这一章并不是…

自学黑客的这些坑千万别踩,不然就是在做无用功!

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键知识并不多 一般人如果想要把编程学好再开始学习网络安全往…

并发编程(3)JMM

5 共享模型之内存 本章内容 上一章讲解的 Monitor 主要关注的是访问共享变量时&#xff0c;保证临界区代码的原子性. 这一章我们进一步深入学习共享变量在多线程间的【可见性】问题与多条指令执行时的【有序性】问题 5.1 Java 内存模型 JMM 即 Java Memory Model&#xff…

SQL库操作

1、创建数据库 概念 创建数据库&#xff1a;根据项目需求创建一个存储数据的仓库 使用create database 数据库名字创建 数据库层面可以指定字符集:charset/character set 数据库层面可以指定校对集:collate 创建数据库会在磁盘指定存放处产生一个文件夹 创建语法 create …

六.生成makefile文件 并基于makefile文件编译opencv

1.点击【Generate】 生成makefile文件 2.进入目录下编译opencv源码&#xff0c;mingw32-make -j 8 3..编译出现报错 4.取消[WITH_OPENCL_D3D11_NV]选项&#xff0c;再次【configure】【generate】 然后再次编译&#xff1a;mingw32-make -j 8

【springblade】springblade(bladeX) 数据权限失效原因分析

文章目录 数据权限接口权限 前言&#xff1a;最近博主在按照bladeX官方文档 配置数据权限 结果发现失效了&#xff0c;网上搜了一下没找到合适的答案&#xff0c;本着求人不如求己的精神&#xff0c;自己调试了一下发现了问题所在&#xff0c;也大致看了一下bladeX的权限逻辑。…

这份攻略帮助你分分钟构建出“幻兽帕鲁游戏”极致体验【下】

在上一篇文章这份攻略帮助你分分钟构建出“幻兽帕鲁游戏”极致体验【上】中写了&#xff0c;极狐GitLab 将 terraform state 文件管理了起来。这篇文章将演示如何将所有的 terraform 文件存储到极狐GitLab 中&#xff0c;并且使用 CI/CD 自动实现 terraform 命令的执行。 在 D…

最简单方式把jar打包成Windows服务

废话 &#x1f622; 将JAR文件转化为Windows服务是一种高效且常见的Java应用部署策略。这种转变赋予了Java应用程序在Windows操作系统上以无界面后台服务模式运行的能力&#xff0c;从而实现了持续、稳定且可靠的功能提供。这种部署方式不仅提升了应用的可用性&#xff0c…

re-迷宫题学习

re中的迷宫问题有以下特点: 在内存中布置一张 "地图"将用户输入限制在少数几个字符范围内.一般只有一个迷宫入口和一个迷宫出口 布置的地图可以由可显字符 (比如#和*)组合而成 (这非常明显, 查看字符串基本就知道这是个迷宫题了.), 也可以单纯用不可显的十六进制值进…

【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期

一、背景 主要梳理下鸿蒙系统开发中常用的生命周期 二、UIAbility组件 UIAbility组件是一种包含UI界面的应用组件&#xff0c;主要用于和用户交互。 UIAbility组件是系统调度的基本单元&#xff0c;为应用提供绘制界面的窗口&#xff1b;一个UIAbility组件中可以通过多个页…