深入学习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 = 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的重点泛型进行学习,最后扩展部分内置工具
由于作者水平有限
如果对本文有任何疑问可以私信或者评论区发表你的看法
本文如果对你有帮助,麻烦点个赞和收藏方便回看,点点关注 谢谢

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Javase-数组

文章目录 1.1 为什么要使用数组1.2 数组的定义及初始化1.3 数组的使用1.4 遍历数组1.5 数组在内存中的存储分析1.6 数组的传参1.7 数组的拷贝 1.1 为什么要使用数组 假设现在有一个任务,要你存储5个同学的学习成绩(double类型),这时候我们可以写出来 double score1 90.4…等五…

谷粒商城-nginx搭建域名访问环境性能压测

nginx搭建域名访问环境 正向代理与反向代理 正向代理&#xff1a;客户端向代理服务器发请求并指定目标服务器&#xff0c;代理向目标服务器转交请求并将获得的内容返回给客户端。 反向代理&#xff1a;用户直接访问反向代理服务器就可以获得目标服务器的资源。反向代理服务器…

Redis能保证数据不丢失吗?

引言 大家即使没用过Redis&#xff0c;也应该都听说过Redis的威名。 Redis是一种Nosql类型的数据存储&#xff0c;全称Remote Dictionary Server&#xff0c;也就是远程字典服务器&#xff0c;用过Dictionary的应该都知道它是一种键值对&#xff08;Key-Value&#xff09;的数…

基于机器学习、遥感和Penman-Monteith方程的农田蒸散发混合模型研究_刘燕_2022

基于机器学习、遥感和Penman-Monteith方程的农田蒸散发混合模型研究_刘燕_2022 摘要关键词 1 绪论2 数据与方法2.1 数据2.2 机器学习算法2.3 Penman-Monteith方程2.4 Medlyn公式2.5 模型性能评估 3 基于机器学习算法的混合模型估算农田蒸散量的评价与比较4 利用人工神经网络算法…

js使用import到本js文件中的函数时报错 Error [ERR_MODULE_NOT_FOUND]: Cannot find module

node:internal/process/esm_loader:97internalBinding(errors).triggerUncaughtException(^Error [ERR_MODULE_NOT_FOUND]: Cannot find module D:\桌面\Pagesizedetection\lib\screensize imported from D:\桌面\Pagesizedetection\index.js Did you mean to import ../lib/sc…

文件上传漏洞--Upload-labs--Pass09(在某些版本的靶场里是Pass10)--点+空格+点 绕过

一、什么是 点空格点 绕过 顾名思义&#xff0c;将 test.php 改为 test.php. . &#xff0c;观察到后缀名php后多出了 点空格点。那么 点空格点 是如何进行绕过的&#xff0c;在什么情况下可以使用&#xff0c;让我们结合题目讲解。 二、代码审计 1、查看题目源代码上半部分&…

Nginx 配置前端工程项目二级目录

前提&#xff1a; 前端工程技术框架: vue 后端工程技术工程&#xff1a;spring boot 需求&#xff1a;需要通过二级目录访问前端工程&#xff1a; 如之前&#xff1a;http://127.0.0.1:80/ 改成 http://127.0.0.1/secondDirectory:80/ 一.前端工程支持二级目录 1.编译文…

CrossOver虚拟机软件2024有哪些功能?最新版本支持哪些游戏?

CrossOver由codewaver公司开发的类虚拟机软件&#xff0c;目的是使linux和Mac OS X操作系统和window系统兼容。CrossOver不像Parallels或VMware的模拟器&#xff0c;而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏&#xff0c;而不…

链表之“无头单向非循环链表”

目录 ​编辑 1.顺序表的问题及思考 2.链表 2.1链表的概念及结构 2.2无头单向非循环链表的实现 1.创建结构体 2.单链表打印 3.动态申请一个节点 3.单链表尾插 4.单链表头插 5.单链表尾删 6.单链表头删 7.单链表查找 8.单链表在pos位置之前插入x 9.单链表删除pos位…

力扣645. 错误的集合(排序,哈希表)

Problem: 645. 错误的集合 文章目录 题目描述思路复杂度Code 题目描述 思路 1.排序 1.对nums数组按从小到大的顺序排序; 2.遍历数组时若判断两个相邻的元素则找到重复元素&#xff1b; 3.记录一个整形变量prev一次置换当前位置元素并与其作差&#xff0c;若差等于2着说明缺失的…

一篇文章搞懂CDN加速原理

目录 一、什么是CDN CDN对网络的优化作用主要体现在以下几个方面&#xff1a; 二、CDN工作原理 CDN网络的组成元素&#xff1a; 三、名词解释 3.1 CNAME记录&#xff08;CNAME record&#xff09; 3.2 CNAME域名 3.3 DNS 3.4 回源host 3.5 协议回源 一、什么是CDN CD…

linux增加物理磁盘并挂载到文件系统

centos7增加物理磁盘并挂载到文件系统 1、查看所有磁盘情况 fdisk -l2、创建挂载路径 mkdir /data3、格式化磁盘 #磁盘filesystem(上图标红处) mkfs.xfs -f /dev/sda建议 与其它磁盘文件系统保持一致&#xff0c;我这里是xfs 可通过 cat /dev/sda查看 4、挂载 mount /dev/…

今日必读的9篇大模型论文

1.Customize-A-Video&#xff1a;文生视频&#xff0c;可以自由定制了 图像定制在文本到图像&#xff08;T2I&#xff09;扩散模型中已经得到了广泛的研究&#xff0c;并取得了令人印象深刻的成果和应用。随着文本到视频&#xff08;T2V&#xff09;扩散模型的兴起&#xff0c…

从零开始手写mmo游戏从框架到爆炸(二十一)— 战斗系统二

导航&#xff1a;从零开始手写mmo游戏从框架到爆炸&#xff08;零&#xff09;—— 导航-CSDN博客 上一章&#xff08;从零开始手写mmo游戏从框架到爆炸&#xff08;二十&#xff09;— 战斗系统一-CSDN博客&#xff09;我们只是完成了基本的战斗&#xff0c;速度属性并没有…

前端数据可视化:ECharts使用

可视化介绍 ​  ​  应对现在数据可视化的趋势&#xff0c;越来越多企业需要在很多场景(营销数据&#xff0c;生产数据&#xff0c;用户数据)下使用&#xff0c;可视化图表来展示体现数据&#xff0c;让数据更加直观&#xff0c;数据特点更加突出。   ​  数据可视化主要目…

读取7400MB/s!华为发布eKitStor Xtreme M.2闪存条

今日&#xff0c;华为举行数据存储新春新品发布会&#xff0c;不仅发布全新数据湖解决方案&#xff0c;华为还针对商业市场与分销市场发布了全闪存存储新品。 据介绍&#xff0c;面向游戏加速、影视编辑、户外作业等场景&#xff0c;华为发布eKitStor Xtreme系列高性能M.2闪存条…

Leetcode3035. 回文字符串的最大数量

Every day a Leetcode 题目来源&#xff1a;3035. 回文字符串的最大数量 解法1&#xff1a;哈希 排序 由于可以随意交换字母&#xff0c;先把所有字母都取出来&#xff0c;然后考虑如何填入各个字符串。 如果一个奇数长度字符串最终是回文串&#xff0c;那么它正中间的那…

一文读懂Linux内核中的Device mapper映射机制

一、 简介 本文总结Device mapper的映射机制。Device mapper是Linux2.6内核中提供的一种逻辑设备到物理设备的映射框架机制&#xff0c;在该机制下&#xff0c;用户可以很方便的根据自己的需要指定实现存储资源的管理策略&#xff0c;当前比较流行的Linux的逻辑卷管理器比如&a…

轻松打造智能化性能测试监控平台:【JMeter+Grafana+Influxdb】的优化整合方案

在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系统、应…

igolang学习3,golang 项目中配置gin的web框架

1.go 初始化 mod文件 go mod init gin-ranking 2.gin的crm框架 go get -u github.com/gin-gonic/gin 3.go.mod爆红解决