首页/新闻资讯/正文详情

The Concise TypeScript Book 精读:TypeScript 类型谓词(Type Predicates)实战指南

发布时间:2026/9/27 7:48:47 来源:云帆数科 栏目:资讯中心
The Concise TypeScript Book 精读:TypeScript 类型谓词(Type Predicates)实战指南
文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载类型谓词Type Predicates是 TypeScript 中一种特殊的函数返回类型标注它让普通返回布尔值的函数升级为可被编译器信任的类型守卫从而在if分支、Array.filter等场景中把变量的类型精确窄化到更具体的类型。本文以《The Concise TypeScript Book》韩文版 类型谓词章节对应英文源文档 type-predicates.md为骨架结合仓库中 窄化章节、探索类型系统章节 与 其他特性章节 的源码级细节系统讲解谓词语法、与各类窄化手段的关系、Array.filter中的实战应用以及 TypeScript 5.5 引入的谓词自动推断能力。读完本文你将掌握value is T的完整写法、适用边界与最佳实践能够自主编写可复用的类型守卫函数。一、什么是类型谓词在 TypeScript 中类型谓词是一种函数它返回一个布尔值同时将变量的类型窄化到更具体的类型。它的核心价值在于把运行时检查逻辑与编译期类型信息绑定在一起——函数体内是普通的 JavaScript 判断而返回类型处的value is string标注则告诉编译器当该函数返回true时传入的参数可以被安全地视为string。原文档给出的经典示例const isString (value: unknown): value is string typeof value string; const foo (bar: unknown) { if (isString(bar)) { console.log(bar.toUpperCase()); } else { console.log(not a string); } };这里有两个层面值得注意运行时层面typeof value string是真实的 JavaScript 判断函数返回值确实是布尔值不影响运行时行为编译期层面: value is string是谓词标注。在if (isString(bar))的true分支内bar的类型从unknown被窄化为string因此可以直接调用bar.toUpperCase()而不会报错else分支中bar仍保持unknown。在仓库的 others.md 中官方定义对此做了精确概括类型守卫type guard是一种函数它求值一个类型谓词并返回布尔值用以指示该谓词为真或为假。二、类型谓词在 TypeScript 窄化体系中的位置类型谓词并非孤立特性它是 TypeScript 类型窄化narrowing体系中的一环。仓库的 窄化章节 明确说明窄化是在条件块内将变量类型具体化的过程在处理联合类型变量可拥有多种类型时尤其有用。该书按顺序介绍了五种内建窄化手段窄化方式判断依据示例typeof类型守卫变量内建的 JavaScript 类型if (typeof x number)真值窄化Truthiness变量是真值还是假值if (name)相等性窄化Equality变量是否等于某个具体值配合switch与/!//!switch (status)in运算符窄化属性是否存在于变量的类型中if (breed in pet)instanceof窄化对象是否为某类/构造函数的实例if (shape instanceof Square)例如仓库 narrowing.md 中的typeof守卫示例const fn (x: number | string) { if (typeof x number) { return x 1; // x is number } return -1; };上述五种方式都属于编译器内置可识别的窄化。而类型谓词用户自定义类型守卫则是把窄化能力开放给开发者当内建手段无法表达你的判断逻辑时你可以自己编写一个函数并用value is T标注其窄化效果。在本书的 目录结构 中좁히기窄化、제어 흐름 분석控制流分析与타입 술어类型谓词依次排列正体现了先学会内建窄化再掌握自定义窄化的学习路径。三、类型谓词语法详解类型谓词的语法要点如下function isString(value: unknown): value is string { return typeof value string; }谓词标注的位置位于函数返回类型处形式为参数名 is 类型其中参数名必须与函数签名中的某个参数名一致返回值语义当函数返回true时TypeScript 会在当前作用域内把该参数的类型窄化为is后面的类型返回false时不产生窄化一个函数只能声明一个谓词无法同时标注value is string又返回另一个谓词结果因此需要判断多种类型时通常拆分为多个谓词函数组合使用与类型断言的本质区别类型断言如value as string是无条件信任而谓词是带运行时验证的窄化后者更安全。仓库 exploring-the-type-system.md 的타입 좁히기类型窄化小节专门讲解了사용자 정의 타입 가드用户自定义类型守卫当 TypeScript 无法自行判断类型时可以编写一个辅助函数利用类型谓词在过滤等操作后窄化类型。原文示例const data [a, null, c, d, null, f]; const r1 data.filter(x x ! null); // 类型为 (string | null)[] // TypeScript 未能正确推断出过滤后的类型 const isValid (item: string | null): item is string item ! null; // 自定义类型守卫 const r2 data.filter(isValid); // 类型为 string[] // 通过谓词类型守卫成功将类型窄化这个例子揭示了谓词最常见的实战价值Array.filter的普通回调无法改变数组元素的静态类型filter(x x ! null)的返回类型仍是(string | null)[]而把谓词函数isValid直接传给filter后TypeScript 会把true分支对应的string类型保留下来得到干净的string[]。四、TypeScript 5.5类型谓词的自动推断原文档重点介绍了 TypeScript 5.5 的一项新能力在.filter这类函数中自动推断类型谓词如x is T。这意味着编译器能够识别何时undefined之类的值被移除从而给出更精确的类型和更少的错误。const nums [1, null, 2].filter(x x ! null);在 TypeScript 5.5 之前上述表达式的推断结果是(number | null)[]升级到 5.5 之后由于回调体x ! null是清晰明确clear的检查编译器会自动为它生成x is number形式的谓词因此nums的类型被推断为number[]后续访问不再需要额外的空值判断。需要特别强调的是原文档指出的适用边界✅ 自动推断只对清晰明确的检查生效例如x ! undefined、x ! null、typeof x string这类一眼可读的判断❌ 对模糊ambiguous的检查不生效例如!!x。!!x只是真值判断无法确定性地说明当其为真时 x 是什么具体类型编译器不会据此生成谓词。这一点与仓库 窄化章节 中真值窄化的语义一脉相承真值判断只能排除null/undefined/0//NaN/false等假值无法精确到一个具体类型因此不能作为谓词推断的依据。五、类型谓词与断言函数的区别类型谓词常与断言函数Assertion Functions混淆仓库 others.md 对二者做了明确区分类型守卫 / 谓词函数求值谓词并返回布尔值谓词不满足时返回false由调用方决定如何处理断言函数谓词不满足时主动抛出错误而不是返回false。断言函数示例function isNumber(value: unknown): asserts value is number { if (typeof value ! number) { throw new Error(Not a number); } }也可以写成函数表达式形式type AssertIsNumber (value: unknown) asserts value is number; const isNumber: AssertIsNumber value { if (typeof value ! number) { throw new Error(Not a number); } };而对应的谓词函数写法则是const isNumber (value: unknown): value is number typeof value number;二者的选择原则若检查失败意味着程序状态非法、应当立即终止用断言函数若检查失败只是走另一个分支用类型谓词。六、编写类型谓词的最佳实践结合原文档与仓库内容编写类型谓词时有以下几点值得遵循谓词必须真实反映运行时语义谓词返回true时参数的实际类型必须确实满足is T的声明否则编译器会基于错误信息进行窄化埋下类型安全隐患保持判断可读、确定如 5.5 自动推断规则所示清晰、无副作用的判断比较运算、typeof不仅利于人读也更容易被编译器理解和推断避免!!x这类含义模糊的表达式让谓词可组合一个函数一个谓词遇到既是数组又每个元素是字符串这类复合判断时可组合多个谓词const isArray (value: unknown): value is unknown[] Array.isArray(value); const isString (value: unknown): value is string typeof value string; const isStringArray (value: unknown): value is string[] isArray(value) value.every(isString);优先使用谓词而非类型断言处理外部输入处理unknown如 JSON.parse 结果、API 响应时谓词能在运行时真正校验数据而不是像as那样单纯告知编译器相信我。七、延伸阅读本书中的相关章节类型谓词是《The Concise TypeScript Book》控制流与类型系统主线的一部分。按仓库 韩文目录 的编排建议按以下顺序继续阅读窄化좁히기掌握typeof、真值、相等性、in、instanceof五种内建窄化控制流分析제어 흐름 분석理解窄化如何在函数体、分支与闭包中传递类型谓词타입 술어即本文所讲的自定义窄化判别联合판별 유니온利用字面量标签字段实现结构化窄化与谓词互补探索类型系统타입 시스템 살펴보기系统了解类型窄化、类型推断、断言与结构类型等底层机制其他特性기타进一步了解断言函数等与类型守卫相关的语言能力。本文对应的源文档位于 website/src/content/docs/ko-kr/book/type-predicates.md英文原版位于 website/src/content/docs/book/type-predicates.md仓库内还提供了 中文版、日文版 等多语言翻译便于对照学习。赞分享文档教程【免费下载链接】typescript-bookThe Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source.项目地址https://gitcode.com/gh_mirrors/typ/typescript-book点击查看免费下载相关推荐The Concise TypeScript Book 精讲类型谓词Type Predicates与 TypeScript 5.5 自动推断The Concise TypeScript Book 精讲类型谓词Type Predicates与 TypeScript 5.5 自动推断 导读 类型谓文档教程The Concise TypeScript Book类型谓词Type Predicates实战指南——从自定义类型守卫到 TypeScript 5.5 的自动推断The Concise TypeScript Book类型谓词Type Predicates实战指南——从自定义类型守卫到 TypeScript 5.5文档教程TypeScript 类型谓词Type Predicates实战指南基于 The Concise TypeScript Book 的类型守卫原理与 5.5 自动推断解析TypeScript 类型谓词Type Predicates实战指南基于 The Concise TypeScript Book 的类型守卫原理与 5.5文档教程上一篇解决Alacritty输入韩文崩溃从异常捕获到字符处理的全链路修复指南下一篇告别集群故障etcd日常运维操作与维护指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

QuickRecorder macOS 录屏指南:三步从安装到录出第一条视频
QuickRecorder macOS 录屏指南:三步从安装到录出第一条视频

QuickRecorder macOS 录屏指南:三步从安装到录出第一条视频 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHu… · 2026/9/27 7:48:47

二维数组的实现
二维数组的实现

The implemention of two-dimensional arrayJava的实现机制Java 的 int[][] 不是一整块连续的二维内存;存放外层引用的槽位连续,但指向的对象不保证地址连续,也就是每个一维数组的地址不一定连续, 所以每行内部元素连续&#xff0… · 2026/9/27 7:48:41

卖游戏辅助的网站怎么建设 3个实战案例拆解
卖游戏辅助的网站怎么建设 3个实战案例拆解

卖游戏辅助的网站怎么建设 3个实战案例拆解 不会写代码也能搭站?别被“技术门槛”吓退。 很多想做游戏辅助售卖的老板,第一反应是找开发公司,结果一报价吓退,或者被坑得底裤都不剩。… · 2026/9/27 7:48:41

如何攻击Wordpress站点常见报错与解决
如何攻击Wordpress站点常见报错与解决

5个WordPress安全陷阱与防御注意事项 改个需求建站公司拖一周,这种憋屈感谁懂?刚上线的WordPress站点,后台改个按钮颜色,外包团队说“底层逻辑冲突”,得排期。结果第二天网站直接变白屏,或者更糟——被黑客植入了恶意代码,SEO收… · 2026/9/27 8:23:47

themeforestwordpress新手避坑速查手册:别花冤枉钱
themeforestwordpress新手避坑速查手册:别花冤枉钱

themeforestwordpress新手避坑速查手册:别花冤枉钱 网站做好了没人访问,比没做还让人焦虑。你盯着后台那可怜个位数的UV,心里直打鼓,是不是域名没选对?是不是服务器太慢?别急,这大概率不是玄学,而是技术选型和基础配置的硬伤。… · 2026/9/27 8:23:47

基于自适应语义路由(Semantic Routing)的知识库多路混合召回实战
基于自适应语义路由(Semantic Routing)的知识库多路混合召回实战

基于自适应语义路由(Semantic Routing)的知识库多路混合召回实战在企业级大型 RAG(检索增强生成)知识库架构中,企业通常维护着数十个物理隔离、数据形态各异的垂直专业知识库(如:API 技术文档库… · 2026/9/27 8:23:34

Onivim 2 按键绑定(Key Bindings)配置完全指南:keybindings.json 格式、when 条件上下文与命令参考
Onivim 2 按键绑定(Key Bindings)配置完全指南:keybindings.json 格式、when 条件上下文与命令参考

开发工具代码编辑器桌面应用 【免费下载链接】oni2 Native, lightweight modal code editor 项目地址: https://gitcode.com/gh_mirrors/on/oni2 点击查看 免费下载 Onivim 2 的按键绑定体系在设计上力求与 VSCode 的 Key Bindings 兼容,同时完整保留 V… · 2026/9/27 8:23:34

NoneBot2 跨插件访问与依赖声明:深入理解 require 机制与插件加载时序
NoneBot2 跨插件访问与依赖声明:深入理解 require 机制与插件加载时序

后端即时通讯 【免费下载链接】nonebot2 跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python 项目地址: https://gitcode.com/gh_mirrors/no/nonebot2 点击查看 免费下载 跨插件调用是 NoneBot2 插件化架构中的… · 2026/9/27 8:23:34

3天搞定域名迁移:此网站域名三天更换完整流程
3天搞定域名迁移:此网站域名三天更换完整流程

3天搞定域名迁移:此网站域名三天更换完整流程 域名服务器搞不懂?别慌。很多站长以为换域名就是改个地址,结果DNS解析卡住、SSL证书报错、后台链接404,折腾三天还没上线。其实,只要理清DNS解析、服务器配置和搜索权重的传递逻辑,… · 2026/9/27 8:23:28

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码