TypeScript 5.3-5.4:新的收窄功能与 NoInfer
应用 NoInfer 工具类型以及新的 switch/case 收窄功能
TypeScript 5.3-5.4:新的收窄功能与 NoInfer 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
TypeScript 5.3 概览
TypeScript 5.3(于 2023 年 11 月发布)改进了 switch/case 语句的类型收窄,增加了 JSDoc 导入类型支持,并支持在 import type 中指定解析模式。
// npm install typescript@5.3Switch/Case 类型收窄改进
TS 5.3 改进了 switch 语句中的类型收窄,尤其适用于包含多个 case 的可辨识联合类型。
type Result = { status: "ok"; data: string } | { status: "err"; code: number };
function handle(r: Result) {
switch (r.status) {
case "ok":
console.log(r.data); // r: { status: "ok"; data: string } — narrowed
break;
case "err":
console.log(r.code); // r: { status: "err"; code: number } — narrowed
break;
}
}JSDoc import type
TS 5.3 增加了对 @import JSDoc 标签的支持,用于在 JavaScript 文件中执行仅类型导入。
/** @import { User } from "./types.js" */
/** @param {User} user */
function greet(user) {
console.log(user.name);
}import type 中的 resolution-mode
TS 5.3 允许在 import type 中指定 resolution-mode,以控制导入解析为 CommonJS 还是 ESM。
import type { User } from "some-library" with { "resolution-mode": "require" };TypeScript 5.4 概览
TypeScript 5.4(于 2024 年 3 月发布)引入了 NoInfer 工具类型,在闭包中保留类型收窄,并增加了 Object.groupBy 和 Map.groupBy 类型。
// npm install typescript@5.4NoInfer<T> 工具类型
NoInfer 会阻止 TypeScript 将泛型参数用作推断位置,强制仅从其他参数推断类型。
function createStore<T>(initial: T, onChange: (val: NoInfer<T>) => void) {
// T inferred from initial, not from onChange callback
}
createStore({ count: 0 }, (val) => {
// val: { count: number } — inferred from initial only
});NoInfer 的重要性
没有 NoInfer 时,TypeScript 会尝试从两个参数推断 T,这可能会意外拓宽类型。
// Before NoInfer: T may be widened by the callback
function createStore<T>(initial: T, onChange: (val: T) => void) {}
createStore({ count: 0 }, (val: { count: number; extra: string }) => {});
// T widened to include extra — not what we want闭包之后保留类型收窄
当类型收窄后的变量在闭包之后没有被赋值时,TS 5.4 会在闭包中保留类型收窄结果。
function process(val: string | null) {
if (!val) return;
// val: string
setTimeout(() => {
console.log(val.toUpperCase()); // TS 5.4: still string — not widened
}, 100);
}Object.groupBy 类型
TS 5.4 为 ES2024 的 Object.groupBy 和 Map.groupBy 静态方法添加了类型。
const users = [
{ name: "Alice", role: "admin" },
{ name: "Bob", role: "user" },
];
const grouped = Object.groupBy(users, (u) => u.role);
// grouped: { [role: string]: { name: string; role: string }[] }改进声明文件生成
TS 5.4 改进了复杂情况下的声明文件生成,这些情况涉及映射类型和条件类型,并减少了生成的 .d.ts 文件中的误报。
// Fewer "Type ... is not assignable to type ..." errors
// in generated declaration files from TS 5.4 onward回顾:TS 5.3–5.4
TS 5.3:改进 switch/case 类型收窄,支持 JSDoc @import。TS 5.4:使用 NoInfer 阻止不需要的类型推断位置,保留闭包中的类型收窄,并增加 Object.groupBy 类型。
快速检查
NoInfer 会阻止什么?
您学到的内容
TS 5.3 改进了 switch/case 类型收窄,并增加了 JSDoc 导入类型。TS 5.4 引入 NoInfer 来控制推断位置,在闭包之间保留类型收窄,并为 ES2024 增加了 Object.groupBy 类型。
用 AI 导师学习 TypeScript — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 101
- 课程
- 352
常见问题解答
「TypeScript 5.3-5.4:新的收窄功能与 NoInfer」课时是免费的吗?
是的 — 「TypeScript 5.3-5.4:新的收窄功能与 NoInfer」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「TypeScript 5.3-5.4:新的收窄功能与 NoInfer」这节课中我会学到什么?
应用 NoInfer 工具类型以及新的 switch/case 收窄功能 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「TypeScript 5.3-5.4:新的收窄功能与 NoInfer」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- TypeScript 5.0:标准装饰器与 const 类型参数
- TypeScript 5.1-5.2:改进的类型推断
- TypeScript 5.3-5.4:新的收窄功能与 NoInfer
- TypeScript 5.5+:隔离声明及更多功能