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 提供默认值。
文章回复
0 条公开回复