TypeScript 类型声明
在 TypeScript 开发中简化类型声明,可以通过以下 7 种实用技巧 显著提升效率:
一、善用类型推断(30% 场景免声明)
// ❌ 冗余写法
const user: { name: string; age: number } = { name: 'Jack', age: 25 };// ✅ 自动推断(hover 变量可见类型)
const user = { name: 'Jack', age: 25 };
二、实用类型工具(20% 代码量)
类型工具 | 应用场景 | 示例 |
---|---|---|
Partial<T> | 所有属性变为可选 | type Draft = Partial<Article>; |
Pick<T, K> | 选取部分属性 | type Preview = Pick<Article, 'title'> |
Omit<T, K> | 排除指定属性 | type SafeUser = Omit<User, 'password'> |
ReturnType<T> | 获取函数返回值类型 | type Result = ReturnType<typeof fetch> |
Record<K, T> | 快速定义键值类型 | type Pages = Record<string, React.FC> |
三、类型守卫简化逻辑(if 判断即类型)
// 自定义类型守卫
function isAdmin(user: User): user is AdminUser {return 'privileges' in user;
}// 使用示例
const handleUser = (user: User) => {if (isAdmin(user)) {user.manageSystem(); // 自动识别为 AdminUser 类型}
}
四、模块化类型管理
types/
├── user.d.ts # 用户相关类型
├── api.d.ts # API 响应类型
└── utils.d.ts # 工具类型
// user.d.ts
export type UserRole = 'admin' | 'user';export interface BaseUser {id: string;name: string;role: UserRole;
}
五、泛型优化重复代码
// 通用响应类型
interface ApiResponse<T = unknown> {code: number;data: T;message?: string;
}// 使用示例
type UserResponse = ApiResponse<User>;
type ListResponse = ApiResponse<User[]>;
六、第三方类型工具库
-
Zod (运行时类型校验)
import { z } from "zod";const UserSchema = z.object({name: z.string(),age: z.number().positive() });type User = z.infer<typeof UserSchema>; // 自动推断类型
-
TypeFest (高级工具类型)
import type { CamelCase } from 'type-fest';type ApiResponse = {user_name: string;total_count: number; };type FrontendData = {[K in keyof ApiResponse as CamelCase<K>]: ApiResponse[K]; }; // { userName: string; totalCount: number }
七、IDE 高效开发技巧
-
快速修复:
在类型错误处按Ctrl+.
自动生成类型声明 -
智能提示:
输入user.
自动显示所有可用属性和方法 -
类型跳转:
Ctrl+Click
跳转到类型定义 -
重命名重构:
F2
安全修改类型名称(自动更新所有引用)
八、框架最佳实践
React 组件 Props
// 使用 interface 自动提示
interface ButtonProps {variant?: 'primary' | 'secondary';children: React.ReactNode;
}const Button: React.FC<ButtonProps> = ({ variant = 'primary', children }) => (<button className={`btn-${variant}`}>{children}</button>
);
Vue Composition API
// 自动推断 ref 类型
const count = ref(0); // Ref<number>
const user = ref<User>(); // Ref<User | undefined>
九、处理第三方库类型
-
DefinitelyTyped:
npm install --save-dev @types/lodash
-
框架内置类型:
// Next.js 页面 Props import type { GetServerSideProps } from 'next';export const getServerSideProps: GetServerSideProps = async () => {// ... }
十、终极简化方案
// 使用 satisfies 运算符(TS 4.9+)
const routes = {home: '/',about: '/about'
} satisfies Record<string, string>;type Routes = keyof typeof routes; // "home" | "about"
通过结合这些技巧,可使 TypeScript 开发效率提升 50% 以上。核心原则是:让类型系统为你工作,而不是对抗它。
相关文章:
TypeScript 类型声明
在 TypeScript 开发中简化类型声明,可以通过以下 7 种实用技巧 显著提升效率: 一、善用类型推断(30% 场景免声明) // ❌ 冗余写法 const user: { name: string; age: number } { name: Jack, age: 25 };// ✅ 自动推断ÿ…...

从0搭建Tomcat第二天:深入理解Servlet容器与反射机制
在上一篇博客中,我们从0开始搭建了一个简易的Tomcat服务器,并实现了基本的HTTP请求处理。今天,我们将继续深入探讨Tomcat的核心组件之一——Servlet容器,并介绍如何使用反射机制动态加载和管理Servlet。 1. Servlet容器的作用 S…...
【Python】yield函数
【Python】yield函数 1. yield介绍2.yield基本用法3.yield高级用法3.1 yield send() 方法3.2 yield from方法3.3 yield 和yield from叠加处理复杂情况下的叠加 4.yield主要应用场景5.总结 python官方api地址 1. yield介绍 在Python中,yield关键字主要用于生成器函…...
Android13修改多媒体默认音量
干就完了! 设置音量为最大音量,修改如下: /framework/base/media/java/android/media/AudioSystem.java/** hide */public static int[] DEFAULT_STREAM_VOLUME new int[] {4, // STREAM_VOICE_CALL7, // STREAM_SYSTEM5, // STREAM_RING-5, // STREAM_MUSIC15, // STREAM…...
nginx+keepalived负载均衡及高可用
一、环境准备 主机名ip地址备注openEuler-1 192.168.121.11(本机) 192.168.131.11(心跳连接) nginx主负载均衡调度器openEuler-2 192.168.121.12(本机) 192.168.131.12(心跳连接) n…...

SP导入智能材质球
智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新...
Kotlin语言特性(一):空安全、扩展函数与协程
Kotlin语言特性(一):空安全、扩展函数与协程 一、引言 Kotlin作为Android官方推荐的开发语言,相比Java具有诸多现代化特性。本文将重点介绍Kotlin三个最具特色的语言特性:空安全、扩展函数和协程,并结合A…...

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接
官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…...

Python 爬虫 – BeautifulSoup
Python 爬虫(Web Scraping)是指通过编写 Python 程序从互联网上自动提取信息的过程。 爬虫的基本流程通常包括发送 HTTP 请求获取网页内容、解析网页并提取数据,然后存储数据。 Python 的丰富生态使其成为开发爬虫的热门语言,特…...

【星云 Orbit-STM32F4】07. 用判断数据尾来接收据的串口通用程序框架
【星云 Orbit-STM32F4】用判断数据尾来接收一串数据的串口通用程序框架 摘要 本文介绍了一种基于STM32F407微控制器的串口数据接收通用程序框架。该框架通过判断数据尾来实现一串数据的完整接收,适用于需要可靠数据传输的应用场景。本文从零开始,详细讲…...
授权与认证之jwt(一)创建Jwt工具类
JWT的Token要经过加密才能返回给客户端,包括客户端上传的Tokn,后端项目需要验证核 实。于是我们需要一个WT工具类,用来加密Token和验证Token的有效性。 一、导入依赖 <dependency><groupId>com.auth0</groupId><artifactId>jav…...
Kubernetes Service服务发现dns之CoreDNS
文章目录 背景什么是Service、服务发现、Endpoint什么是CoreDNSCoreDNS 的工作原理 常用命令coredns 运行状态根据服务名,判断某个服务dns解析是否正常 背景 Kubernetes 集群内部的服务发现是微服务架构的核心基础,而 DNS 服务则是实现这一机制的关键组…...

Spring Boot 测试:单元、集成与契约测试全解析
一、Spring Boot 分层测试策略 Spring Boot 应用采用经典的分层架构,不同层级的功能模块对应不同的测试策略,以确保代码质量和系统稳定性。 Spring Boot 分层架构: Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] …...

用友NC系列漏洞检测利用工具
声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 目录标题 YongYouNcTool启动及适配环境核心功能界面预览一键检测命令执…...
PostgreSQL 创建表格
PostgreSQL 创建表格 在数据库管理中,表格(Table)是数据存储的基础。PostgreSQL作为一款强大的开源对象关系型数据库管理系统(ORDBMS),创建表格是其最基本的功能之一。本文将详细讲解如何在PostgreSQL中创…...

一周一个Unity小游戏2D反弹球游戏 - 球的死区及球重生
前言 本文将实现当球弹到球板下方的死亡区域后,球会被重置到球板上发射点,并且重置物理状态的逻辑。 创建球的死亡区 之前创建的在屏幕下方的空气墙碰撞体可以将其Is Trigger勾选上,让其成为一个触发器,用来检测球是否进入该区域,如下。 创建一个脚本名为Deadzone…...

本地部署 DeepSeek:从 Ollama 配置到 Spring Boot 集成
前言 随着人工智能技术的迅猛发展,越来越多的开发者希望在本地环境中部署和调用 AI 模型,以满足特定的业务需求。本文将详细介绍如何在本地环境中使用 Ollama 配置 DeepSeek 模型,并在 IntelliJ IDEA 中创建一个 Spring Boot 项目来调用该模型…...

vue3:三项目增加404页面
一、路由添加 1、官网地址 带参数的动态路由匹配 | Vue Routerhttps://router.vuejs.org/zh/guide/essentials/dynamic-matching.html 2、复制核心语句 { path: /:pathMatch(.*)*, name: NotFound, component: NotFound } 3、粘贴到路由index.js中 4、建立页面 在view文件夹…...

MCAL(Microcontroller Abstraction Layer)介绍
目录 MCAL的核心作用 MCAL的模块组成 1. 微控制器驱动(Microcontroller Drivers) 2. I/O驱动(DIO, PWM, ADC等) 3. 通信驱动(Communication Drivers) 4. 存储驱动(Memory Drivers…...
爬虫:PhantomJS的详细使用和实战案例
文章目录 一、PhantomJS介绍1.1 什么是 PhantomJS1.2 PhantomJS 的特点与优势二、PhantomJS 的安装2.1 在 macOS 上安装 PhantomJS2.2 在 Linux 上安装 PhantomJS2.3 在 Windows 上安装 PhantomJS2.4 验证安装三、PhantomJS 的基本使用3.1 示例 1:打开网页并截图3.2 示例 2:获…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...