当前位置: 首页 > news >正文

神奇的TypeScript -- 进阶篇之实用工具类型

系列文章目录

神奇的TypeScript – 基础篇


文章目录

  • 系列文章目录
  • 前言
  • 一、运算符和分布式联合类型
  • 二、实用工具类型
    • 1. 修改已有的类型属性:Partial|Required|Readonly
      • 1.1 用法
      • 1.2 代码示例
      • 1.3 手动实现一个Partial
    • 2. 选择或剔除类型中的属性:Pick|Omit
      • 2.1 Pick
        • 2.1.1 用法
        • 2.1.2 手动实现一个Pick
      • 2.2 Omit
        • 2.2.1 用法
        • 2.2.2 手动实现一个 Omit
    • 3. Record
      • 3.1 用法
      • 3.2 手动实现一个 Record
    • 4. Extract | Exclude
      • 4.1 Extract
        • 4.1.1 用法
        • 4.1.2 手动实现
      • 4.2 Exclude
        • 4.2.1 用法
        • 4.2.2 手动实现
    • 5. ReturnType | Parameters
      • 5.1 ReturnType
        • 5.1.1 用法
        • 5.1.2 手动实现
      • 5.2 Parameters
        • 5.2.1 用法
        • 5.2.2 手动实现
    • 6. InstanceType | ConstructorParameters
      • 6.1 InstanceType
      • 6.1.1 用法
      • 6.1.2 手动实现
      • 6.2 ConstructorParameters
        • 6.2.1 用法
    • 7. NonNullable
      • 7.1 用法
      • 7.2 手动实现
  • 总结


前言

TypeScript作为一个强类型语言,TypeScript 为我们也提供了很多实用工具类型,让我们可以以一种方便的方式来操作现有类型并从中创建新类型。他们可以帮助我们更轻松地描述常见类型转换,提高代码的可读性和可维护性。

一、运算符和分布式联合类型

我们先来了解一下基础的几个运算符,这几个运算符我们在后面会经常用到:

keyof: 获取类型中的所有属性名称key,返回一个包含所有属性名称的联合类型。
typeof: 获取类型。
in:遍历,可以用来遍历联合类型。
extends:
1. 用来声明类继承,A extends B也就是A继承B;
2. 定义条件类型,C extends D ? C : nerve即遍历C(联合类型)与D进行比较,如果相同则保留,返回一个不包含D类型的的C类型
infer: infer 只能在条件类型的 extends 子句中使用,用来提取类型信息,并且声明的类型变量只能在条件类型的真值分支中使用。

以及一个特殊的类型判断:
分布式联合类型:当条件类型遇到联合类型时,它会把条件类型应用于联合类型中的每个成员,然后将结果合并成一个新的联合类型。

type DAD<T> = T extends () => infer U ? U : never;

二、实用工具类型

我们先定义一个Person的接口类型

interface Person {name: string;age: number;height?: number;what?: null;why: undefined;sayHello(): void;
}

1. 修改已有的类型属性:Partial|Required|Readonly

Partial 将所有属性改为可选属性。
Required 将所有属性改为必填属性。
Readonly 将所有属性改为只读属性。

1.1 用法

Partial<Type>
Required<Type>
Readonly<Type>

Type:想要修改的类型

1.2 代码示例

// 将所有属性变为可选
type PersonPartial = Partial<Person>;
// 将所有属性变为必选
type PersonRequired = Required<Person>;
// 将所有属性变为只读
type PersonReadonly = Readonly<Person>;const o: PersonPartial = {}
const p: PersonRequired = {name: "",sayHello: function (): void {throw new Error("Function not implemented.");},age: 0,height: 0,what: null,why: undefined
};
const q: PersonReadonly = {name: "",sayHello: function (): void {throw new Error("Function not implemented.");},age: 0,why: undefined
};

1.3 手动实现一个Partial

// 实现一个Partial
type PersonPartialCopy<T> = {[k in keyof T]: T[k];
}const PPC: PersonPartialCopy<Person> = {name: "",sayHello: function (): void {throw new Error("Function not implemented.");},age: 0,why: undefined
}

2. 选择或剔除类型中的属性:Pick|Omit

Pick 用于从类型中选取指定的属性。
Omit 用于从类型中排除指定的属性。

2.1 Pick

选择类型中的属性

2.1.1 用法
Pick<Type, Keys>

Type: 要选取属性的类型。
Keys: 要选取的属性的键的联合类型。

type PersonPick = Pick<Person, "name" | "age">;
2.1.2 手动实现一个Pick
type PersonPickRealize<T, K extends keyof T> = {[k in K]: T[k];
}
const PPR: PersonPickRealize<Person, "name" | "age"> = {name: "",age: 0
}

2.2 Omit

剔除类型中的属性

2.2.1 用法
Omit<Type, Keys>

Type: 要排除属性的类型。
Keys: 要排除的属性的键的联合类型。

type PersonOmit = Omit<Person, "name">;
2.2.2 手动实现一个 Omit
type PersonOmitRealize<T, K extends keyof T> = {[k in Exclude<keyof T, K>]: T[k]
}
const POR: PersonOmitRealize<Person, "name"> = {age: 0,sayHello: () => { },height: undefined,what: undefined,why: undefined
}

3. Record

Record用来构造一个所有属性都相同类型的类型

3.1 用法

type PersonRecord = Record<"name" | "age", string>;

3.2 手动实现一个 Record

type PersonRecordRealize<K extends keyof any, T> = {[k in K]: T;
}
let s: Symbol = Symbol(1);
const PRR: PersonRecordRealize<"name" | 123, string> = {name: "",123: ""
}

4. Extract | Exclude

选择联合类型类型中的类型

4.1 Extract

4.1.1 用法
type PersonExtract = Extract<Person | string, Person>;
4.1.2 手动实现
const PEE: PersonExtract = {name: "",sayHello: () => { },age: 0,why: undefined
}

4.2 Exclude

剔除联合类型中的一些类型

4.2.1 用法
type PersonExclude = Exclude<Person | string, Person>;
4.2.2 手动实现
type PersonExcludeRealize<T, U> = T extends U ? never : T;
const PE: PersonExclude = "123";

5. ReturnType | Parameters

function foo(a: number, b: string): boolean { return false; }

5.1 ReturnType

获取函数函数返回类型

5.1.1 用法
type FooReturnType = ReturnType<typeof foo>;
5.1.2 手动实现
type ReturnTypeRealize<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : never;

5.2 Parameters

获取函数参数类型,返回一个元组

5.2.1 用法
type FooParameters = Parameters<typeof foo>;
5.2.2 手动实现
type FooParametersRealize<T extends (...args: any) => any> = T extends (...args: infer U) => any ? U : never;
class Animal {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}sayHello() {console.log(`Hello, my name is ${this.name}`);}
}

6. InstanceType | ConstructorParameters

6.1 InstanceType

构造函数类型的实例类型

6.1.1 用法

type AnimalInstanceType = InstanceType<typeof Animal>;

6.1.2 手动实现

type AnimalInstanceTypeRealize<T extends abstract new (...args: any) => any> = T extends abstract new (...args: any) => infer R ? R : any;
const AI: AnimalInstanceTypeRealize<typeof Animal> = new Animal("", 0);

6.2 ConstructorParameters

构造函数的类型来构造元组或数组类型

6.2.1 用法
type AnimalConstructorParameters = ConstructorParameters<typeof Animal>;

7. NonNullable

去除联合类型中的null和undefined

7.1 用法

type PersonNonNullable = NonNullable<undefined | null | string>;
const PNN: PersonNonNullable = "123";

7.2 手动实现

type PersonNonNullableRealize<T> = T extends null | undefined ? never : T;
const ONNR: PersonNonNullableRealize<undefined | null | string> = "123";

总结

TypeScript 的实用工具类型是预定义的类型函数,提供对现有类型的便捷转换和操作。可以轻松地创建新类型或修改现有类型,而无需手动编写冗长的类型定义。∂∂∂

  • 提高代码可读性: 提供简洁的语法来表达常见的类型转换,使代码更易于阅读和理解。
  • 增强类型安全性: 通过提供类型检查来帮助您避免常见的类型错误,从而提高代码的可靠性。
  • 简化类型定义: 可以减少需要编写的类型定义代码量,从而提高开发效率。

总而言之,TypeScript 的实用工具类型是编写类型安全、清晰且表达能力强的代码的有力工具。

相关文章:

神奇的TypeScript -- 进阶篇之实用工具类型

系列文章目录 神奇的TypeScript – 基础篇 文章目录 系列文章目录前言一、运算符和分布式联合类型二、实用工具类型1. 修改已有的类型属性&#xff1a;Partial&#xff5c;Required&#xff5c;Readonly1.1 用法1.2 代码示例1.3 手动实现一个Partial 2. 选择或剔除类型中的属性…...

工业5G路由器驱动矿山无人值守及井下监控数据传输

矿山行业作为国民经济发展的重要组成部分&#xff0c;其生产效率和安全性一直被广泛关注着。随着信息技术的飞速发展&#xff0c;矿山数字化转型已成为必然趋势。矿山井下环境复杂&#xff0c;传统的人工巡检和监控方式存在效率低、成本高、安全隐患大等问题。 由于户外矿山和…...

Windows图形界面(GUI)-MFC-C/C++ - CSliderCtrl

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 CSliderCtrl 创建滑动条 设置滑动条属性 成员函数 消息处理 注意事项 示例代码 CSliderCtrl 创建滑动条 在对话框编辑器中&#xff0c;从工具箱中拖拽一个Slider Control到对话框…...

ViP-LLaVA: Making Large Multimodal Models Understand Arbitrary Visual Prompts

发表时间&#xff1a;cvpr2024 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId2357936887983293952&noteId2426262228488986112 作者单位&#xff1a;University of Wisconsin–Madison Motivation&#xff1a;现在的多模态模型都关注整张图像的理…...

beeline -e 执行SQL中有双引号

一、问题 beeline -e 执行SQL中有双引号 害怕执行报错 --简单示例 beeline -e "select * from table_name where col1 "abc"" 二、解决方法 1.替换sql中的双引号为单引号 --简单示例 beeline -e "select * from table_name where col1 abc"…...

TikTok運營環境搭建:使用靜態住宅IP

Tik Tok作為一款在全球範圍內流行的短視頻平臺&#xff0c;目前跨境電商也將Tik Tok作為行銷的主要陣地&#xff0c;越來越多的用戶和企業開始關注如何優化其使用體驗和行銷效果。而Tik Tok作為行銷工具使用對網路環境要求較高&#xff0c;很多用戶在運營帳號時會出現限流、帳號…...

sqlserver跟踪sql导出

文章目录 sqlserver跟踪sql导出打开跟踪窗口登录到数据库服务器新增跟踪&#xff0c;配置跟踪属性导出sql脚本 sqlserver跟踪sql导出 打开跟踪窗口&#xff0c;登录到数据库服务器&#xff0c;新增跟踪&#xff0c;配置跟踪属性&#xff0c;确定&#xff0c;业务数据操作&…...

Linux安全与高级应用(三)深入探索MySQL数据库:安装、管理与安全实践

文章目录 深入探索MySQL数据库&#xff1a;安装、管理与安全实践MySQL数据库简介MySQL的安装与配置编译安装MySQL配置MySQL服务 MySQL数据库的基本操作数据库的创建与删除表的创建与管理数据记录的增删改查 MySQL用户管理与权限设置MySQL数据库的备份与恢复数据库备份数据库恢复…...

el-input输入数字,带有千分位

封装组件 <template><el-inputchange"changenum"input"onTxtInput"blur"blurInput"v-model"inputnum1"placeholder"请输入数字"clearable:disabled"disablednum"></el-input> </template&g…...

行为型设计模式3:模板方法/备忘录/解释器/迭代器

设计模式&#xff1a;模板方法/备忘录/解释器/迭代器 (qq.com)...

测试用例等级划分

基本等级&#xff08;‌Level 1或P0&#xff09;‌&#xff1a;‌这类用例设计系统基本功能&#xff0c;‌执行失败会导致多处重要功能无法运行。‌例如&#xff0c;‌单表维护中的增加功能、‌最平常的业务使用等&#xff0c;‌这些是发生概率较高的功能用例。‌这类用例在每一…...

正则表达式 贪婪与非贪婪匹配

目录 一. 回顾二. 遇到的问题三. 分析四. 解决4.1 转换为非贪婪模式匹配4.2 提高匹配的精度 一. 回顾 我们在正则表达式 分组与非捕获组这篇文章中&#xff0c;有如下分组匹配案例 <select name"fruit_console"><option value"apple" selected&…...

LVS-DR模式集群:案例与概念

DR模式&#xff08;直接路由&#xff09; 概念 Direct Routing&#xff0c;简称DR模式采用半开放式的网络结构&#xff0c;与TUN模式的结构类似&#xff0c;但内网服务器并不是分散在各地&#xff0c;而是与调度器位于同一个物理网络负载调度器与内网服务器通过本地网络连接&a…...

小试牛刀-Telebot区块链游戏机器人(TS升级)

目录 1.编写目的 2.为什么使用TypeScript实现? 3.实现功能 3.1 AI图片生成 3.2 签到 3.3 邀请 3.4 WalletConnect连接 4.功能实现详解 4.1 AI图片生成 4.2 签到 4.3 邀请 4.4 WalletConnect连接 5.功能截图 ​6.问题整理 Welcome to Code Blocks blog 本篇文章主…...

使用SpringBoot+Vue3开发项目(2)---- 设计文章分类的相关接口及页面

目录 一.所用技术栈&#xff1a; 二.后端开发&#xff1a; 1.文章分类列表渲染&#xff1a; 2.新增文章分类&#xff1a; 3.编辑文章分类&#xff1a; 4.删除文章分类 &#xff1a; 5.完整三层架构后端代码&#xff1a; &#xff08;1&#xff09;Controller层&#xff1a…...

django电商易购系统-计算机毕业设计源码61059

目 录 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 电商易购系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 电商易购系统总…...

uniapp video播放视频 悬浮在屏幕无法滑动

背景&#xff1a; 在uniapp中&#xff0c;需要使用<video></video>标签进行播放动态src的视频。 1.在开发的时候&#xff0c;运行到浏览器&#xff0c;vedio标签正常&#xff1b;(使用HbuildX运行&#xff0c;运行 -->运行到浏览器)。 2.但是在打包成原生App&am…...

day22(mysql数据库主从搭建)

上午&#xff1a; 1、为mysql添加开机启动chkconfig 2、编辑配置文件my.cnf 3、修改环境变量 4、mysql角色授权 角色不生效 在配置文件中不添加activate_all_roles_on_loginon glibc安装&#xff0c;my.cnf在项目目录之下 rpm安装&#xff0c;my.cnf文件在/etc/my.cnf 5、自…...

C++——多态经典案例(三)计算器

案例&#xff1a;使用多态实现一个简单的计算器&#xff0c;计算两个数的加减乘除结果 分析&#xff1a;定义一个抽象类AbstractCalc &#xff0c;其内部定义一个纯虚函数getResult&#xff0c;用于得到计算结果 定义加减乘除四个类&#xff0c;分别继承这个抽象类AbstractCal…...

超声波清洗机怎么选?超声波眼镜清洗机选择哪个牌子比较好?

对于许多近视的人来说&#xff0c;眼镜是至关重要的&#xff0c;因为它们帮助人们清晰地看到远处的物体。虽然很多人会定期擦拭和保养眼镜&#xff0c;但不少人对正确的清洁方法并不十分了解。那么&#xff0c;眼镜脏了该如何彻底清洁&#xff1f;如何确保在保养过程中不会划伤…...

24. 两两交换链表中的节点(Java)

目录 题目描述&#xff1a;示例 &#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&am…...

【深度学习】【语音】TTS效果排行榜

TTS技术排行榜:顶尖模型详解及技术洞察 文本到语音(TTS)技术正以惊人的速度发展,为各种行业提供了更加自然和逼真的语音解决方案。本篇博客将详细介绍目前市场上表现最佳的TTS模型,深入探讨每个模型的技术特性和是否开源,帮助您更好地理解它们的优势和应用场景。 1. El…...

登录相关功能的优化【JWT令牌+拦截器+跨域】

登录相关功能的优化 登录后显示当前登录用户el-dropdown: Element - The worlds most popular Vue UI framework <el-dropdown style"float: right; height: 60px; line-height: 60px"><span class"el-dropdown-link" style"color: white;…...

2024年武汉东湖高新区职称第二批次开始了

众所周知&#xff0c;武汉市东湖高新区职称一年两批次&#xff0c;今年下半年第二批水平能力测试报名也已经开始了&#xff0c;请注意报名时间&#xff0c;别错过&#xff01;&#xff01; 2024年武汉东湖高新区第二批次水测报名时间&#xff1a;&#xff08;一&#xff09;网上…...

力扣面试经典算法150题:移除元素

移除元素 今日的题目依旧是力扣面试经典算法150题中数组相关的题目&#xff1a;移除元素 题目链接&#xff1a;https://leetcode.cn/problems/remove-element/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个排序数组 nums 和一个值 val&a…...

【爬虫实战】利用代理爬取Temu电商数据

引言 在行业竞争激烈、市场变化快速的跨境电商领域&#xff0c;数据采集可以帮助企业深入了解客户需求和行为&#xff0c;分析市场趋势和竞争情况&#xff0c;从而优化产品和服务&#xff0c;提高客户满意度和忠诚度。同时&#xff0c;数据采集可以实时跟踪库存水平和销售情况&…...

智谱 AI 开源视频生成模型CogVideoX:单张 4090 显卡即可推理

随着大型模型技术的持续发展&#xff0c;视频生成技术正逐步走向成熟。以Sora、Gen-3等闭源视频生成模型为代表的技术&#xff0c;正在重新定义行业的未来格局。 而近几个月&#xff0c;国产的AI视频生成模型也是层出不穷,像是快手可灵、字节即梦、智谱清影、Vidu、PixVerse V…...

Webpack、Vite区别知多少?

前端的项目打包&#xff0c;我们常用的构建工具有Webpack和Vite&#xff0c;那么Webpack和Vite是两种不同的前端构建工具,那么你们又是否了解它们的区别呢&#xff1f;我们在做项目时要如何选择呢&#xff1f; 一、工具定义 1、Webpack&#xff1a;是一个强大的静态模块打包工…...

【网络编程】网络原理(一)

系列文章目录 1、 初识网络 2、网络编程的基础使用&#xff08;一&#xff09; 文章目录 系列文章目录前言一、端口号的使用二、UDP报文学习1.报文格式2.MD5算法 总结 前言 在前文中&#xff0c;主要对UDP和TCP协议有了简单的了解&#xff0c;而这两种协议是负责传输层的内容…...

基于树莓派的智能家居中控系统:集成Flask、HTML、JavaScript与MQTT协议的文心一言AI接入(代码示例)

一、项目概述 随着智能家居技术的快速发展&#xff0c;越来越多的用户希望通过智能设备提升家居生活的便利性和智能化水平。本项目旨在搭建一个基于树莓派的AI接入文心一言智能家居中控系统。该系统能够根据AI获取的实时数据&#xff08;如天气、温度、湿度等&#xff09;自动…...

给出一组数的从大到小的排序索引

要在 Python 中获得一组数从大到小排序的索引&#xff0c;你可以使用 NumPy 库的 argsort 方法&#xff0c;并结合 - 符号来实现降序排序。argsort 方法返回的是数组元素从小到大的索引值&#xff0c;因此我们可以通过加上负号 - 来使其变成从大到小的顺序。 下面是具体的步骤和…...

RHEL9网络设定及网络脚本

1. 添加一张网卡 2. 重写一个网卡配置文件 [rootlocalhost ~]# cd /etc/NetworkManager/system-connections/ [rootlocalhost system-connections]# ls ens160.nmconnection [rootlocalhost system-connections]# vim ens224.connection [rootlocalhost system-connections…...

人工智能计算机视觉先锋——OpenCv 的颜色检测

红色 在计算机的世界里&#xff0c;只有 0 或者1&#xff0c;如何让计算机认识颜色是计算机视觉工作者首先需要考虑的事情&#xff0c;我们知道整个世界的颜色虽然五彩缤纷&#xff0c;但是都是3种原色彩合成的&#xff08;R G B&#xff09;&#xff0c;有了&#xff08;R G …...

pytorch学习(十):损失函数与反向传播

损失函数&#xff08;Loss Function&#xff09; 损失函数是衡量模型预测值与真实值之间差异的一个函数。在训练神经网络时&#xff0c;我们的目标是找到一组参数&#xff08;如权重和偏置&#xff09;&#xff0c;使得模型的预测尽可能接近真实值&#xff0c;即最小化损失函数…...

day58|拓扑排序精讲,dijkstra(朴素版)精讲

拓扑排序精讲 117. 软件构建 (kamacoder.com) #include <iostream> #include <vector> #include <algorithm> #include <queue> #include <unordered_map>using namespace std;int main(){int n, m, s, t;cin >> n >> m;vector<…...

基于SSH的医院在线挂号系统设计与实现

点击下载源码 基于SSH的医院在线挂号系统设计与实现 摘 要 互联网技术迅速的发展给我们的生活带来很大的方便&#xff0c;同时也让许多行业迅速的发展起来。互联网技术已走向科技发展的巅峰期&#xff0c;我们要做的就是合理的使用互联网技术让我们的各个行业得到更快速的发展…...

TOPIK韩语等级考试|韩语语法:被动词和使动词

韩语语法&#xff1a; 被动词与主动词 글쓰기 관련 강좌나 책에서 우리 문장을 쓸 때 웬만하면 피동형을 쓰지 말라는 주장을 흔히 접하게 된다. 능동형 동사를 사용하면 글이 늘어지지 않아 간결해지고 힘찬 문장이 되는 게 사실이다. 그러나 이 주장이 우리글에서 피동형 동…...

基于大模型的Agent

2023年&#xff0c;对于所有的人工智能领域只有一个共同的主题——大模型。大模型的受关注程度与发展速度可谓前所未有。其中&#xff0c;基于大模型的Agent又是最近几个月大模型领域的热点。这不开始研究没有几个月&#xff0c;综述文章都出来了&#xff0c;你说快不快&#x…...

解决k8s flannel网络插件国内镜像docker拉取不到问题

一、准备下载资源 https://download.csdn.net/download/weixin_43205308/89608560 以下&#xff0c;每个k8s节点都要执行 二、载入镜像 解压上面的下载资源的文件夹后&#xff0c;会有图中的两个资源 载入资源 docker load --input flannel-flannel-v0.25.1-amd64.tar.gzd…...

HTML-03.新浪新闻-标题-样式2

1.<span>标签 <span>是一个在开发网页时大量使用的没有语义的布局标签 特点&#xff1a;一行可以显示多个&#xff08;行内组合元素&#xff09;&#xff0c;宽度和高度默认由内容撑开 2.CSS选择器 2.1 元素选择器&#xff1a;标签名{...} 元素名称{ color:red; }…...

玩转大模型之五(测试FastGPT高级编排)

一、高级编排 FastGPT 从 V4 版本开始采用新的交互方式来构建 AI 应用。使用了 Flow 节点编排&#xff08;工作流&#xff09;的方式来实现复杂工作流&#xff0c;提高可玩性和扩展性。但同时也提高了上手的门槛&#xff0c;有一定开发背景的用户使用起来会比较容易。 编排方…...

YOLO:输入mp4视频数据,经过YOLO目标检测算法,输出带有目标框的新视频

作者&#xff1a;CSDN _养乐多_ 本文将介绍输入mp4视频数据&#xff0c;经过YOLO目标检测算法&#xff0c;输出带有目标框的新视频的代码脚本。 文章目录 一、代码 一、代码 代码只需要安装好cv2、ultralytics&#xff0c;然后修改模型路径、输入mp4视频文件路径、保存文件的…...

渲染技术如何应对数据增长与计算挑战

随着科技的飞速发展&#xff0c;数字内容的制作与呈现变得日益复杂和精细&#xff0c;这对渲染技术提出了前所未有的挑战。特别是在数据爆炸式增长和计算需求急剧提升的背景下&#xff0c;如何优化渲染技术&#xff0c;以应对这些挑战&#xff0c;成为了一个亟待解决的问题。 …...

uniapp用自带的canvas做画板签字

如下图移动端经常需要做此功能,用户签字。用户填表啥的。 先用touch进行监听手指的触摸事件 获取所点击的坐标位置。 这里有很多要注意的地方。 初始化 uniapp里的canvas与原生的canvas有区别,渲染之后会多很多莫名其妙的div节点,并且还有个div直接就把原生的canvas覆盖…...

Vue 3+Vite+Eectron从入门到实战系列之(二)一Elementplus及VueRouter的配置

为了后续开发方便,在没有 UI 设计师配合的情况下,让我们的界面更加美观,我们使用 elementplus 组件库,并配置路由。 删除不需要的默认文件夹及文件,src 配置如下 实现效果 安装 elementplus,vue-router npm install element-plus --save npm install vue-router --save在…...

JVM笔记一

JVM的功能 解释和运行 对字节码文件中的指令&#xff0c;实时的解释成机器码&#xff0c;让计算机执行。 内存管理 自动为对象、方法等分配内存自动的垃圾回收机制&#xff0c;回收不再使用的对象 即时编译 对热点代码进行优化&#xff0c;提高执行效率。将热点代码解释并…...

Flink 实时数仓(二)【DIM 层搭建】

1、DIM 层搭建 1.1、设计要点 DIM层设计要点&#xff1a; DIM层存的是维度表&#xff08;环境信息&#xff0c;比如人、场、货等&#xff09;DIM层的数据存储在 HBase 表中DIM层表名的命名规范为dim_表名 DIM 层表是用于维度关联的&#xff0c;要通过主键&#xff08;维度外…...

如何提高编程能力?(来自准大三学长的含泪建议)

种一棵树最好是十年前&#xff0c;其次是现在 想了解更多内容可以看我主页&#xff1a;GGBondlctrl-CSDN博客 1.前言 以下是小编的亲身经历哟 &#xff08;1&#xff09;大一&#xff0c;摆烂 -------和每个人一样&#xff0c;大学都是带着美好的憧憬&#xff0c;我开始学习…...

PostgreSQL 高阶函数详解:全面深入的功能与实用示例

PostgreSQL 高阶函数详解 PostgreSQL 是一款功能强大的开源关系数据库管理系统&#xff0c;以其丰富的功能和高扩展性著称。在数据处理和分析方面&#xff0c;PostgreSQL 提供了一系列高阶函数&#xff0c;可以极大地简化和优化各种复杂操作。本文将详细介绍 PostgreSQL 的高阶…...

8–9月,​Sui Move智能合约工作坊将在台北+线上举行

你对区块链和去中心化应用感兴趣吗&#xff1f;想深入学习Sui Move编程语言吗&#xff1f; 从8月10日到9月28日&#xff0c;Sui Mover社区将在每周六下午13:00–17:00举办精彩的工作坊&#xff0c;为期两个月&#xff0c;带你从零基础入门到高级进阶&#xff0c;全面掌握Sui M…...