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

ts的内置工具类型

什么是 TypeScript 的工具类型?

TypeScript 提供了一些 ​​内置的、通用的类型工具​​,它们本质上是 ​​基于泛型的高级类型操作​​,用来帮助开发者:

  • 更灵活地操作已有类型

  • 提取、组合、约束、转换对象的属性类型

  • 减少重复代码,提高类型安全与开发效率

这些工具类型 ​​并不是函数​​(不是运行时函数,而是​​类型层面的工具​​),但习惯上我们称它们为 ​​“工具类型” 或 “工具函数”​​,因为它们的使用方式类似函数调用,比如:

type PartialUser = Partial<User>;

✅ 二、TypeScript 常用内置工具类型一览表

下面是 TypeScript 内置的、最常用的工具类型,以及它们的作用和示例 👇

工具类型

作用

示例

Partial<T>

将类型 T的所有属性变为 ​​可选​

type PartialUser = Partial<User>;

Required<T>

将类型 T的所有属性变为 ​​必填​

type RequiredUser = Required<PartialUser>;

Readonly<T>

将类型 T的所有属性变为 ​​只读(不可修改)​

type ReadonlyUser = Readonly<User>;

Pick<T, K>

从类型 T中 ​​选取部分属性 K​​,构成新类型

type NameOnly = Pick<User, 'name'>;

Omit<T, K>

从类型 T中 ​​排除某些属性 K​​,构成新类型

type UserWithoutId = Omit<User, 'id'>;

Record<K, V>

构造一个类型,其键为类型 K,值为类型 V(常用于字典/映射)

type UserMap = Record<number, User>;

Exclude<T, U>

从联合类型 T中 ​​排除可以赋值给 U 的类型​

type NonString = Exclude<string \| number, string>;→ number

Extract<T, U>

从联合类型 T中 ​​提取可以赋值给 U 的类型​

type OnlyString = Extract<string \| number, string>;→ string

NonNullable<T>

从类型 T中 ​​移除 null和 undefined

type NotNullable = NonNullable<string \| null \| undefined>;→ string

Parameters<T>

获取函数类型 T的 ​​参数类型组成的元组​

用于提取函数参数类型

ReturnType<T>

获取函数类型 T的 ​​返回值类型​

用于提取函数返回值类型

ConstructorParameters<T>

获取构造函数类型的所有参数类型(比如 class 的构造参数)

InstanceType<T>

获取构造函数类型 T的实例类型


✅ 三、最常用的几个工具类型详解 + 示例


1. ​Partial<T>—— 所有属性变为可选​

interface User {id: number;name: string;age: number;
}type PartialUser = Partial<User>;
// 等价于:
// {
//   id?: number;
//   name?: string;
//   age?: number;
// }

✅ ​​用途:​​ 比如表单编辑时,你可能只更新部分字段,而不是全部


2. ​Required<T>—— 所有属性变为必填​

type RequiredUser = Required<PartialUser>;
// 所有原来可选的属性,现在都变成必填了

✅ ​​用途:​​ 强制要求某些数据完整,比如提交时


3. ​Readonly<T>—— 所有属性只读​

type ReadonlyUser = Readonly<User>;
// 所有属性都变成 readonly,不可修改
// 比如用于配置对象、常量对象等

4. ​Pick<T, K>—— 挑选某些属性​

type NameOnly = Pick<User, 'name'>;
// { name: string }

✅ ​​用途:​​ 比如你只关心用户的 name 字段,其它都不要


5. ​Omit<T, K>—— 排除某些属性​

type UserWithoutId = Omit<User, 'id'>;
// { name: string; age: number }

✅ ​​用途:​​ 比如提交数据时不传 id(由后端生成)


6. ​Record<K, V>—— 构建键值映射类型​

type UserMap = Record<number, User>;
// 等价于:{ [key: number]: User }

✅ ​​用途:​​ 比如你有一个以 ID 为 key 的用户字典/缓存


7. ​Exclude<T, U>和 Extract<T, U>—— 联合类型操作​

type T = string | number;
type OnlyString = Extract<T, string>;  // string
type NotString = Exclude<T, string>;   // number

✅ ​​用途:​​ 比如过滤出某种特定类型,常用于处理联合类型


8. ​NonNullable<T>—— 去掉 null 和 undefined​

type T = string | null | undefined;
type ValidString = NonNullable<T>; // string

✅ ​​用途:​​ 比如你确定某个值不应该为 null/undefined,做类型收窄


9. ​Parameters<T>和 ReturnType<T>—— 函数类型工具​

function greet(name: string): string {return `Hello, ${name}`;
}type GreetParams = Parameters<typeof greet>;  // [name: string]
type GreetReturn = ReturnType<typeof greet>; // string

✅ ​​用途:​​ 提取函数参数类型和返回值类型,常用于高阶函数、Hooks、封装等


✅ 四、在哪里用到了这些工具类型?(实际应用场景)

工具类型

常见使用场景

Partial<T>

表单数据、更新操作(只传部分字段)

Required<T>

提交数据校验,确保必填字段都有值

Readonly<T>

配置对象、常量对象,防止被修改

Pick<O, K>

只选择对象中的部分字段,比如 API 返回的数据只用一部分

Omit<O, K>

去掉敏感字段或不需要传的字段,比如去掉 idpassword

Record<K, V>

构建字典、映射表,比如 { [id: number]: User }

Exclude<T, U>

类型过滤,比如从联合类型中排除某些类型

Extract<T, U>

类型筛选,比如只提取某种类型

NonNullable<T>

过滤掉可能为 null/undefined 的值,提高类型安全

Parameters<T>ReturnType<T>

提取函数参数和返回值类型,用于高阶函数、自定义 Hook、wrapper 函数等

  • 如何结合 ​​泛型 + 工具类型​​ 做更强大的类型推导

  •  案例 1:​​通用 API 请求 Hook(结合泛型 + ReturnType / Parameters)​

    场景:

    你有一堆 API 请求函数,比如:

    function fetchUser(id: number): Promise<{ name: string; age: number }> { return axios.get(`/user/${id}`).then(res => res.data); }

    你希望写一个通用的 useApiHook,它能:

  • 接受一个异步函数

  • 自动推导出它的 ​​参数类型​​ 和 ​​返回值类型​

  • 提供 loading、error、data 状态

  • 如何在 ​​React + TypeScript 项目中广泛使用这些工具类型​​(比如自定义 Hook、高阶组件、表单、API 层)

http://www.dtcms.com/a/392241.html

相关文章:

  • 扫地车:守护多元场景的清洁 “多面手”
  • 力扣 136.只出现一次的数字
  • 【序列晋升】38 Spring Data MongoDB 的统一数据访问范式与实践
  • 如何将枯燥的大数据呈现为可视化的图和动画?
  • 前后端分离架构下,如何安全存储和使用 API 密钥?
  • Nano 编辑器快捷键
  • 《智能体教程》——如何构建多智能体系统:开发者实用指南
  • 小杰机器学习高级(three)——逻辑回归、二分类算法
  • Spring注解驱动开发:从XML到注解的完美蜕变
  • 【Spring AI】第三弹:深入解析 RAG 核心特性、关键流程、基于 Spring AI + 知识库实现 RAG 检索增强器
  • 【剪映】官方下载方式?【图文详解】电脑版下载?正版安全下载?最新版下载?
  • 《UE5_C++多人TPS完整教程》学习笔记56 ——《P57 未装备武器的蹲伏(Crouch Unequipped)》
  • AI人工智能训练师五级(初级)考试题库(1)1~100题
  • 【Python精讲 02】编程第一课:彻底掌握Python变量、数字、字符串与布尔值
  • Unity2D-Sprite
  • 本地实现视频分析与总结工具
  • Vue 开发常见报错及解决方案指南
  • Linux 进程状态
  • 基于自然语言处理的文本敏感内容检测系统的设计与实现
  • JDBC小白入门项目创建 IDEA 空项目+模块配置 JavaWeb MySQL
  • 笔记 Docker(离线)安装(24.0.9)
  • Docker-Android+cpolar:移动开发的环境革命
  • uniapp首先对战匹配简单实现
  • [bitcoin白皮书_2] 隐私 | 计算
  • 【杂谈】-重构注意力经济:人工智能重塑短视频内容生态
  • 【杂谈】Godot 4.5下载指南
  • CICD工具选型,Jenkins VS Arbess哪一款更好用?
  • iOS 26 续航测试实战,如何测电池掉电、Adaptive Power 模式功耗、新系统更新后的耗电差异与 App 续航优化指南
  • 数据挖掘与KDD:从理论到实践的最佳流程解析
  • 深入理解Linux网络中的Socket网络套接字——基础概念与核心实现