TypeScript 3.5 版本新特性全解析:`Omit` 辅助类型、智能联合类型检查与增量构建提速
文档教程【免费下载链接】TypeScriptTypeScript 使用手册中文版翻译。http://www.typescriptlang.org项目地址https://gitcode.com/gh_mirrors/typ/TypeScript点击查看免费下载本文基于仓库中 TypeScript 3.5 版本发布说明 整理而成。TypeScript 3.5 是一版以性能 类型安全 类型推断能力为核心升级的里程碑版本它在 3.4 基础上大幅优化了类型检查与--incremental增量构建的速度新增了内置Omit辅助类型强化了联合类型下的多余属性检查与判别式联合的智能分解推断并带来了泛型构造函数的高阶类型推断。读完本文你将掌握这些特性的具体用法、底层原理与可能引发的破坏性变更并能在自己的项目中直接落地使用。一、改进速度类型检查与增量构建的双重优化TypeScript 3.5 针对 3.4 版本引入了多项性能优化重点覆盖两个方向常规类型检查路径以及--incremental增量构建模式。1.1 类型检查速度提升3.5 对 3.4 的某些内部处理逻辑进行了优化使类型检查整体更高效。这一收益在类型检查驱动的操作例如代码补全列表、hover 提示、重命名等编辑器场景上尤其显著——这些操作往往需要在极短时间内反复进行局部类型检查优化后响应更跟手。1.2 改进--incremental重新构建提速 68%--incremental构建模式由 TypeScript 3.4 引入见 TypeScript 3.4 版本说明开启该标志后编译器会把上一次编译的项目图信息保存到.tsbuildinfo文件中下次构建时据此只重做成本最低的检查与生成工作。3.5 的核心改进在于扩大了缓存范围——除了类型信息本身编译器还缓存了编译器设置compiler options 的计算结果寻找文件的原因文件解析的触发逻辑文件在哪里被找到模块解析结果与路径。换言之3.5 把为什么要找、找到了什么、在哪里找到这三个阶段的中间状态全部沉淀下来避免后续构建重复计算。官方在引入该特性的 pull request 中报告重新构建花费的时间比 TypeScript 3.4 减少了约 68%对应--incremental改进的 PR 为缓存tsconfig.json计算模块解析缓存见缓存模块解析的 PR。注.tsbuildinfo文件是纯构建缓存可以安全删除不会影响运行时行为它仅用于加速编译。更早版本3.6在此基础上进一步公开了createIncrementalProgram、createIncrementalCompilerHost与readBuilderProgram等 API供 Gulp、Webpack 等第三方构建工具操作增量构建可参考 TypeScript 3.6 版本说明。一个典型的--incremental配置如下源自 TypeScript 3.4 版本说明// tsconfig.json { compilerOptions: { incremental: true, outDir: ./lib }, include: [./src] }开启后tsc默认在输出目录./lib下生成/复用.tsbuildinfo也可以用--tsBuildInfoFile标志自定义缓存文件的位置与名称。二、Omit辅助类型从类型中剔除指定属性TypeScript 3.5 在标准库中新增了OmitType, Keys辅助类型用于创建从原始类型中移除了某些属性的新类型这是日常类型编程中使用频率极高的工具类型。2.1 基本用法type Person { name: string; age: number; location: string; }; type QuantumPerson OmitPerson, location; // 相当于 type QuantumPerson { name: string; age: number; };使用Omit辅助类型我们可以快速复制Person中除了location之外的所有属性而无需手动重写一遍完整的字段列表。OmitType, Keys的语义可以概括为从类型Type中获取所有属性再从中剔除Keys指定的属性后构造一个新类型。它在仓库的 工具类型参考文档 中有完整收录典型示例如下interface Todo { title: string; description: string; completed: boolean; } type TodoPreview OmitTodo, description; const todo: TodoPreview { title: Clean room, completed: false, };2.2 破坏性变更lib.d.ts全局声明了Omit由于 3.5 将Omit内建进lib.d.ts标准库声明文件如果你在项目里全局定义过自己的Omit升级后会触发以下编译错误Duplicate identifier Omit.对此仓库的 TypeScript 3.5 破坏性变更文档 给出了两个变通方案删除重复定义直接使用lib.d.ts提供的Omit从模块中导出你自己的定义避免与全局冲突现有使用方可通过import显式引用项目旧有的Omit类型。值得一提的是早在 TypeScript 2.8 版本说明中官方就曾明确表示暂不新增OmitT, K因为它可以很容易地用PickT, Excludekeyof T, K表示3.5 将其纳入标准库正是对这一长期诉求的正式回应。三、改进联合类型中的多余属性检查Excess Property Checks在 TypeScript 3.4 及之前的版本中存在一个类型安全漏洞对联合类型做对象字面量多余属性检查时检查被完全跳过导致本不该存在的属性也能混入。例如type Point { x: number; y: number; }; type Label { name: string; }; const thing: Point | Label { x: 0, y: 0, name: true, // uh-oh! };name的类型是boolean它在Point与Label中都不匹配但在 3.4 及以前无判别discriminant的联合类型不会对其成员执行任何多余属性检查于是这个类型错误的name属性溜了进来。3.1 3.5 的新规则在 TypeScript 3.5 中类型检查器至少会验证所有提供的属性属于联合类型中的某个成员且类型恰当。因此上面的例子会正确报错。同时规则保留了一定的灵活性只要属性类型对某个成员有效仍允许部分重叠。例如const pl: Point | Label { x: 0, y: 0, name: origin, // okay };这里name: origin的类型是string恰好匹配Label成员的name: string因此完全合法。四、--allowUmdGlobalAccess标志模块内也可访问 UMD 全局声明TypeScript 3.5 新增了--allowUmdGlobalAccess编译选项。在此之前一个以 UMDUniversal Module Definition格式声明的全局变量在非模块文件中可以直接当作全局使用但在模块内部却无法引用其全局形态开启该标志后你可以从任何位置包括模块引用全局的 UMD 声明。UMD 声明的典型形态是在.d.ts文件中使用export as namespaceexport as namespace foo;这个模式增加了混合和匹配第三方库的灵活性——那些库声明的全局变量从此总是可以被使用甚至可以安全地在模块内部被引用而不再需要额外编写import或declare global之类的桥接代码。使用方式在tsconfig.json中开启或通过命令行传入{ compilerOptions: { allowUmdGlobalAccess: true } }tsc --allowUmdGlobalAccess适用前提该标志只对以 UMD 方式通过export as namespace声明的库生效普通全局declare var不受影响。五、更智能的联合类型检查判别属性的自动分解推断这是 3.5 在类型推断能力上的一次重要跃迁。先看 3.4 及之前会报错的场景type S { done: boolean; value: number }; type T { done: false; value: number } | { done: true; value: number }; declare let source: S; declare let target: T; target source;这个赋值在过去是非法的。原因是S无法被单独分配给{ done: false, value: number }也无法被单独分配给{ done: true, value: number }——因为S中的done是宽泛的boolean而T的每个成员都要求明确的字面量类型true或false。这种逐个成员检查的方式正是问题所在TypeScript 不会先把各个属性合并起来整体判断S是否能赋值给T。如果不做这种整体合并一些糟糕的代码可能会被放行interface Foo { kind: foo; value: string; } interface Bar { kind: bar; value: number; } function doSomething(x: Foo | Bar) { if (x.kind foo) { x.value.toLowerCase(); } } // uh-oh - 幸运的是TypeScript 在这里会提示错误! doSomething({ kind: foo, value: 123, });value: 123与Foo.value: string冲突这里必须报错。然而对于最初的例子逐个成员检查又显得过于严格——如果我们能弄清S的任何可能值的精确类型实际上可以看到它与T中的类型完全匹配。5.1 3.5 的解决思路判别属性驱动分解在 TypeScript 3.5 中当把S赋值给具有判别属性discriminant property的类型T时类型检查器会将S分解为每个可能成员类型的联合再逐一比对。具体来说boolean本质上是字面量true与false的联合因此S会被视为{ done: false, value: number }与{ done: true, value: number }的联合这两个成员恰好与T的两个分支完全吻合赋值合法。这一机制让宽泛属性 判别联合的代码在 3.5 中得以正确通过类型检查同时仍不会放行像kind: foo, value: 123这类真正类型错误的写法做到了安全性与实用性的平衡。六、泛型构造函数的高阶类型推断TypeScript 3.4 已经改进了对返回函数的泛型函数的推断。以组合函数compose为例function composeT, U, V(f: (x: T) U, g: (y: U) V): (x: T) V { return x g(f(x)); }把另外两个泛型函数作为参数传入function arrayifyT(x: T): T[] { return [x]; } type BoxU { value: U }; function boxifyU(y: U): BoxU { return { value: y }; } let newFn compose(arrayify, boxify);3.4 的推断允许newFn保持泛型其类型为T(x: T) BoxT[]而不是旧版本推断出的相对无用的具体类型如(x: {}) Box{}[]。TypeScript 3.5 将这一行为推广到了构造函数class constructorclass BoxT { kind: box; value: T; constructor(value: T) { this.value value; } } class BagU { kind: bag; value: U; constructor(value: U) { this.value value; } } function composeCtorT, U, V( F: new (x: T) U, G: new (y: U) V ): (x: T) V { return x new G(new F(x)); } let f composeCtor(Box, Bag); // 拥有类型 T(x: T) BagBoxT let a f(1024); // 拥有类型 BagBoxnumber组合两个泛型类Box与Bag后f仍是泛型函数且调用时能精确推导出BagBoxnumber这样的嵌套具体类型。6.1 对 React 类组件等高阶场景的意义除了上述组合模式这种对泛型构造函数的新推断还意味着在 React 等 UI 库中对类组件进行操作的高阶函数HOC可以更正确地对泛型类组件进行操作。示例如下type ComponentClassP new (props: P) ComponentP; declare class ComponentP { props: P; constructor(props: P); } declare function myHocP(C: ComponentClassP): ComponentClassP; type NestedPropsT { foo: number; stuff: T }; declare class GenericComponentT extends ComponentNestedPropsT {} // 类型为 new T(props: NestedPropsT) ComponentNestedPropsT const GenericComponent2 myHoc(GenericComponent);GenericComponent是泛型类组件经过myHoc包装后得到的GenericComponent2仍然保留泛型参数T而不是被推断成固定的具体组件类型——这使得 HOC 包装后的组件在 JSX 中使用时依旧具备完整的类型推导能力。七、升级注意与延伸阅读破坏性变更由于lib.d.ts内建Omit请检查项目中是否全局定义过同名类型参考 TypeScript 3.5 破坏性变更 处理重复标识符问题。版本脉络--incremental的基础机制见 TypeScript 3.4 版本说明3.5 之后对增量构建 API、.tsbuildinfo体积的持续优化可参考 TypeScript 3.6、TypeScript 4.3、TypeScript 4.8 等版本说明。工具类型速查Omit、Pick、Exclude、Extract、NonNullable、Parameters、ReturnType等内置工具类型的完整用法与示例见 工具类型参考。新增功能索引完整的新版本特性清单见 版本发布说明目录。赞分享文档教程【免费下载链接】TypeScriptTypeScript 使用手册中文版翻译。http://www.typescriptlang.org项目地址https://gitcode.com/gh_mirrors/typ/TypeScript点击查看免费下载相关推荐TypeScript 3.8 新特性全解析类型导入、私有字段、顶层 await 与增量检查TypeScript 3.8 新特性全解析类型导入、私有字段、顶层 await 与增量检查 导读 本文基于 TypeScript 使用手册中文版的 3.8文档教程linux-tutorial 之命令行的艺术Linux 命令行高效使用实战指南linux tutorial 之命令行的艺术Linux 命令行高效使用实战指南 本篇指南以《命令行的艺术》The Art of Command Line为文档教程TypeScript 2.2 新特性详解混合类、object 类型与更严格的空值检查TypeScript 2.2 新特性详解混合类、 object 类型与更严格的空值检查 本文基于 TypeScript 使用手册中文版的 TypeScri文档教程上一篇mini-swe-agent 模型工具函数解析get_model / get_model_name / get_model_class 的选取逻辑与全局成本控制下一篇Go 夜读Go 开发者 Vim 环境配置全解析.vimrc 完整方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ZED双目测距与YOLO检测融合实战:从原理到避坑指南

ZED双目测距与YOLO检测融合实战:从原理到避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 12:52:02 阅读更多 →
rsuite Nav 组件图标实战指南:用 icon 属性打造带图标导航与图标化多级菜单

rsuite Nav 组件图标实战指南:用 icon 属性打造带图标导航与图标化多级菜单

前端UI组件 【免费下载链接】rsuite 🧱 A suite of React components . 项目地址: https://gitcode.com/gh_mirrors/rs/rsuite 点击查看 免费下载 导读 本文聚焦 rsuite 的 Nav(导航)组件在“带图标”场景下的完整用法&#xf…

2026/9/30 4:28:49 阅读更多 →
Midway 中 @midwayjs/crud 组件完全指南:面向资源的标准 CRUD 能力与 REST 路由生成

Midway 中 @midwayjs/crud 组件完全指南:面向资源的标准 CRUD 能力与 REST 路由生成

后端微服务云原生 【免费下载链接】midway 🍔 A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate w…

2026/10/1 11:06:54 阅读更多 →

最新新闻

Strands Agents Harness SDK:从原型到生产级Agent开发实战

Strands Agents Harness SDK:从原型到生产级Agent开发实战

Agent 开发这件事,很多人第一次接触时都会有一种"我是不是把它想复杂了"的错觉。你打开一个主流框架的文档,跟着写一个 ReAct 循环,跑通了,感觉挺好;然后你想加个工具调用、加个多轮记忆、加个流式输出、加个…

2026/10/1 12:51:58 阅读更多 →
音乐流行趋势预测:大数据与机器学习的工程实战

音乐流行趋势预测:大数据与机器学习的工程实战

帮一家音乐平台做流行趋势预测项目的经历,到现在我依然觉得是这几年最有价值的一次实战。目标听起来很简单:在歌曲发布后的前两周内,判断它能不能冲进热歌榜前100,顺便预测上榜后的热度走势。但真跑起来我才发现,这个任…

2026/10/1 12:51:58 阅读更多 →
UML用例图怎么画?参与者、include/extend与图书管理系统实战

UML用例图怎么画?参与者、include/extend与图书管理系统实战

带过几届做课程设计的学生之后,我发现一个相当稳定的规律:用例图画得最花哨的那组,需求文档往往写得最烂;而真正把系统想明白了的那组,用例图看起来反而朴素得有点丑。用例图这个东西门槛极低,画图工具里拖…

2026/10/1 12:51:58 阅读更多 →
两级冲击时间控制制导律的Matlab仿真实现与调参解析

两级冲击时间控制制导律的Matlab仿真实现与调参解析

做协同制导仿真的同学,看到“冲击时间控制”这个词应该都知道分量。简单说就是让多枚导弹在同一个时刻命中目标——这在饱和攻击、时间协同这类场景里是硬需求,而对单枚导弹而言,就是要让它的实际飞行时间精确收敛到一个预先设定的期望冲击时…

2026/10/1 12:51:58 阅读更多 →
16组实验复现判定模型失败:rerank配合小模型的边界与取舍

16组实验复现判定模型失败:rerank配合小模型的边界与取舍

两天的实验排期,16 组配置,从 rerank 权重到小模型选型再到判定阈值,我几乎把能想到的组合都跑了一遍。结果很直接:没有复现出那个判定模型。但这个过程里踩到的坑、看到的边界、摸清的取舍逻辑,比一个"成功复现&…

2026/10/1 12:51:58 阅读更多 →
连点器全攻略:鼠标自动连点、键盘输入与免费工具筛选

连点器全攻略:鼠标自动连点、键盘输入与免费工具筛选

连点器这三个字一出来,很多人第一反应是"游戏挂机脚本",但说实话我用了这么多年,鼠标自动连点真正帮我省下大把时间的场景,反而是那些枯燥到让人怀疑人生的重复工作:一遍遍点"下一步"、批量填表、…

2026/10/1 12:50:58 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →