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

news2024/11/14 15:35:06

文章目录

    • 概要
    • 一.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 = name
        this.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: T
    age: N
    slogan: T
}

const obj: IObj<string, number> = {
    name: 'wuu',
    age: 20,
    slogan: '哈哈哈'
}

3.泛型接口

interface IObj<T, N> {
    name: T
    age: N
    slogan: 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: string
    age: 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://www.coloradmin.cn/o/1464591.html

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

相关文章

深度学习中的样本分类:如何区分正样本、负样本、困难样本和简单样本?

深度学习中的样本分类&#xff1a;如何区分正样本、负样本、困难样本和简单样本&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入…

思维导图教你工作日报怎么写?

工作日报撰写秘诀&#xff1a;轻松提升效率&#xff0c;让你的每一天都闪闪发光 在快节奏的现代工作中&#xff0c;如何高效地规划和管理工作任务成为了职场人士必须面对的挑战。思维导图作为一种强大的思维工具&#xff0c;正逐渐受到越来越多人的青睐。本文将探讨为什么使用…

MySQL 索引原理以及 SQL 优化

索引 索引&#xff1a;一种有序的存储结构&#xff0c;按照单个或者多个列的值进行排序。索引的目的&#xff1a;提升搜索效率。索引分类&#xff1a; 数据结构 B 树索引&#xff08;映射的是磁盘数据&#xff09;hash 索引&#xff08;快速锁定内存数据&#xff09;全文索引 …

opencv的图像上下、左右和对角线翻转—flip函数

在OpenCV中&#xff0c;flip函数用于翻转图像。你可以沿x轴、y轴或两者同时翻转图像。这个函数非常直接&#xff0c;可以用于创建镜像图像或旋转图像。 void flip(InputArray src, OutputArray dst, int flipCode);src&#xff1a;输入图像。 dst&#xff1a;翻转后的输出图像…

安卓系统和iOS系统的手机备忘录同步数据方法

在这个智能手机时代&#xff0c;安卓与iOS系统犹如两位王者&#xff0c;各自拥有庞大的用户群体。有人钟情于安卓的开放与多样&#xff0c;有人偏爱iOS的流畅与稳定。甚至&#xff0c;有些人为了满足不同需求&#xff0c;同时使用着两个系统的手机。我就是其中的一员。 工作中…

ELK 简介安装

1、概念介绍 日志介绍 日志就是程序产生的&#xff0c;遵循一定格式&#xff08;通常包含时间戳&#xff09;的文本数据。 通常日志由服务器生成&#xff0c;输出到不同的文件中&#xff0c;一般会有系统日志、 应用日志、安全日志。这些日志分散地存储在不同的机器上。 日志…

RAW 编程接口 TCP 简介

一、LWIP 中 中 RAW API 编程接口中与 TCP 相关的函数 二、LWIP TCP RAW API 函数 三、LwIP_Periodic_Handle函数 LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数&#xff0c;一般在 main函数的无限循环中调用&#xff0c;主要功能是为 LwIP各个模块提供…

LeetCode | 整数反转 C语言

Problem: 7. 整数反转 文章目录 思路解题方法Code结果 思路 运算部分 while(x > 0) {y x % 10;y * 10;x / 10; } y / 10;对于大于32位的数要用long int类型的变量保存用pow算-2的31次方和2的31次方-1。 解题方法 由思路得 Code int reverse(long int x){long int y …

bat 查找文件所在

脚本 在批处理文件&#xff08;.bat&#xff09;中查找文件所在的目录&#xff0c;你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例&#xff0c;演示如何在批处理文件中查找指定文件并输出其所在目录&#xff1a; echo off setlocal enabledelayedexpansio…

预训练大模型LLM的PEFT之——LORA

简介 LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS&#xff0c;直接翻译过来就是大模型的低秩适配 2021年微软提出的LoRA&#xff0c;它的灵感来自于 Li和 Aghajanyan等人的一些关于内在维度&#xff08;intrinsic dimension&#xff09;的发现&#xff1a;模型是过参…

[HTML]Web前端开发技术27(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

大型语言模型的语义搜索(一):关键词搜索

关键词搜索(Keyword Search)是文本搜索种一种常用的技术&#xff0c;很多知名的应用app比如Spotify、YouTube 或 Google map等都会使用关键词搜索的算法来实现用户的搜索任务&#xff0c;关键词搜索是构建搜索系统最常用的方法&#xff0c;最常用的搜索算法是Okapi BM25&#x…

post请求向服务器发送JSON格式数据设置Content-Type

情景&#xff1a;与后台联调接口时&#xff0c;后台要求传递JSON格式的数据。 处理&#xff1a;我们进行XHR请求时需要设置请求头的Content-Type值为application/json&#xff0c;如下图所示。 浏览器查看具体请求与参数格式&#xff08;形式&#xff09;如下&#xff1a;

ubuntu20.04安装实时内核补丁PREEMPT_RT

参考&#xff1a; Ubuntu 18.04安装 RT-PREEMPT 实时内核及补丁【过程记录】_ubuntu18.04 preempt rt linux 5.6.19-CSDN博客 https://github.com/UniversalRobots/Universal_Robots_ROS_Driver/blob/master/ur_robot_driver/doc/real_time.md当前内核&#xff1a;5.15.0-94-ge…

ShardingSphere 5.x 系列【13】绑定表

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 问题演示3. 绑定表1. 概述 关联查询是数据库查询中的一种常用操作…

企业微信变更企业主体的流程

企业微信变更主体有什么作用&#xff1f;做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

00后编程交流qq群 欢迎广大编程爱好者加入

&#x1f680;【00后编程交流&兼职外包】&#x1f680; 链接直达&#xff1a; 点击此处加入群聊&#xff08;无需验证&#xff09; &#x1f4cc; 群简介&#xff1a; 欢迎加入【00后编程交流&兼职外包】QQ群&#xff01;这里是一个专为00后编程爱好者打造的交流平台…

装饰模式(Decorator Pattern)

定义 装饰模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许通过将对象包装在装饰器类的实例中来动态地添加新的行为和责任。这种模式可以在不修改现有代码的情况下&#xff0c;灵活地扩展对象的功能。 示例 考虑一个咖啡店的场景&…

设置主从复制时发生报错Could not find first log file name in binary log index file‘;解决方案

如图所示&#xff0c;slave_io_runnind:no,slave_sql_running:yes 此时&#xff0c;主从配置错误&#xff0c;我们可以查看Last_IO_Error:来查看报错信息 此时&#xff0c;我们需要停止从服务器的主从服务&#xff0c; mysql> stop slave; Query OK, 0 rows affected, 1 w…

【开源】JAVA+Vue.js实现医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…