0

0

JavaScript类型检查_TypeScript泛型高级用法

幻影之瞳

幻影之瞳

发布时间:2025-11-20 20:15:43

|

697人浏览过

|

来源于php中文网

原创

javascript类型检查_typescript泛型高级用法

TypeScript 的泛型不只是简单的类型占位符,它在复杂类型操作中有着非常强大的能力。通过结合条件类型、映射类型和类型推断,可以实现灵活且安全的类型检查,尤其适用于构建可复用的工具类型或库。

条件类型与泛型结合

条件类型允许你根据类型关系做“判断”。语法是 T extends U ? X : Y,表示如果 T 可以赋值给 U,则结果为 X,否则为 Y。

常见用法是过滤或转换联合类型:

type NonNullable = T extends null | undefined ? never : T;
type Exclude = T extends U ? never : T;

例如,Exclude 会返回 'b' | 'c',这在定义 API 输入时很有用。

立即学习Java免费学习笔记(深入)”;

泛型中的 infer 关键字

infer 用于在条件类型中“提取”类型信息。比如你想获取函数的返回值类型:

type ReturnType =
  T extends (...args: any[]) => infer R ? R : never;

这里 infer R 表示“如果 T 是函数,就推断它的返回类型为 R”。

也可以提取参数类型:

type Parameters =
  T extends (...args: infer P) => any ? P : never;

这种模式在封装高阶函数或中间件时特别实用。

约束泛型:extends 的高级用法

你可以用 extends 限制泛型的范围,确保传入的类型满足特定结构。

Avatar AI
Avatar AI

AI成像模型,可以从你的照片中生成逼真的4K头像

下载

例如,只允许对象类型:

function getProperty(obj: T, key: K) {
  return obj[key];
}

这样调用 getProperty({ name: "hello" }, "name") 会正确推断返回 string 类型,且不允许传入无效 key。

还可以结合索引访问类型,实现深层属性获取:

type DeepGet =
  K extends `${infer Key}.${infer Rest}`
    ? Key extends keyof T
      ? DeepGet
      : never
    : K extends keyof T
      ? T[K]
      : never;

这个类型能支持类似 DeepGet 的路径访问。

映射类型与泛型组合

映射类型可以基于已有类型生成新类型。结合泛型,可以创建通用的修饰工具。

例如,将某些属性设为可选:

type PartialByKeys = {
  [P in keyof T]: P extends K ? T[P] | undefined : T[P];
};

或者创建只读子集:

type ReadOnlyByKeys = {
  readonly [P in K]: T[P];
}  & Omit;

这类模式在状态管理或表单处理中很常见。

基本上就这些。TypeScript 泛型的高级用法依赖于对类型系统逻辑的理解,不复杂但容易忽略细节。熟练掌握后,能显著提升代码的类型安全性与复用性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

47

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

192

2026.02.25

什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

182

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

6468

2023.07.31

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 4.9万人学习

Go 教程
Go 教程

共32课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号