编译器、注解与推导
TypeScript 先检查源码,再由编译器生成 JavaScript。它不会在浏览器中替你验证用户输入,因此“编译通过”和“运行安全”是两个不同结论。
先观察推导结果
ts
const count = 1;
let message = 'ready';
const labels = ['todo', 'done'];
message = 'running';
labels.push('blocked');const count 的值和类型都不能重新赋值;let message 被推导为 string,数组被推导为 string[]。注解应表达边界或意图,而不是把每个明显的局部变量都写一遍。
编译检查不等于运行时校验
ts
type User = { id: string; name: string };
function greeting(user: User) {
return `Hello ${user.name}`;
}
const raw: unknown = JSON.parse('{"id":"u1","name":"Ada"}');
// greeting(raw); // unknown 不能直接当 User 使用unknown 要求代码先证明结构,再调用业务函数;any 会跳过这道门。来自网络、文件和本地存储的数据默认都应当视为未知。
练习
把 parseUser 写成返回 unknown 的函数,并在调用 greeting 前检查 id 和 name 都是字符串。输入 { "id": 1 } 时必须拒绝,不能返回半成品用户。