DevCN
菜单
全部文章快讯开发深度热点

TypeScript 入门:用类型描述任务并在编译期发现误用

定义任务类型并计算完成时长,了解可选字段、严格编译与类型擦除,区分代码约束和运行时输入验证。


本节目标

定义任务类型并计算完成时长,了解可选字段、严格编译与类型擦除,区分代码约束和运行时输入验证。

环境与运行方法

安装 Node.js 与项目内 TypeScript 编译器。保存为 lesson.ts,执行 npx tsc lesson.ts --strict --target ES2020 --module commonjs --outDir dist,再运行 node dist/lesson.js。编译成功不等于外部数据已经校验。

核心思路

类型为编辑器和编译器描述对象形状。Task 中的 title、minutes、done 必须存在,note 可选。示例数据由程序内部创建,所以可以依赖声明;外部接口数据仍需要验证。

完整示例

type Task = {title: string; minutes: number; done: boolean; note?: string};
const tasks: Task[] = [
  {title: "types", minutes: 25, done: true},
  {title: "tests", minutes: 35, done: false}
];
const total = tasks.filter(task => task.done)
  .reduce((sum, task) => sum + task.minutes, 0);
console.log("total=" + total);
console.log(tasks[0].note ?? "no note");

预期输出

total=25
no note

逐步理解

filter 得到完成任务,reduce 从零开始累计。可选 note 可能不存在,空值合并运算符在 null 或 undefined 时提供默认文本,不会把空字符串一并当成缺失。

TypeScript 生成的 JavaScript 不包含这些类型声明。把任意 JSON 强制断言为 Task 不会自动补字段,也不会把字符串分钟数变成数字。类型系统能够提前发现代码误用,但数据边界仍是程序自己的责任。

常见问题与边界

  • any 会绕过大量检查,不应作为解决错误的通用办法。
  • number 并不保证非负整数。
  • 编译产物要更新,不能修改 ts 后一直运行旧 js。

动手练习

把 minutes 改为字符串,再增加一个 note 为空字符串的任务。

参考答案

字符串 minutes 应在严格编译时被拒绝。空字符串 note 仍显示为空,因为 ?? 只为 null 和 undefined 提供默认值。

DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。