讲解
TypeScript 的基本类型对应 JavaScript 的原始值:string、number、boolean、bigint、symbol,以及两个特殊值类型 null 和 undefined。其中 number 不区分整数和浮点数(与 JavaScript 一致),bigint 用于任意精度整数(字面量写法 100n),symbol 用于创建唯一标识。
真正需要重点理解的是三个「兜底」类型:any、unknown 和 never。any 表示「放弃检查」——标注为 any 的值可以做任何操作,编译器一律放行,它存在的意义是迁移老代码时的逃生舱,新项目应当避免。unknown 是类型安全版的 any:什么都能装,但取出来用之前必须先收窄(narrow)确认类型,否则会报错。never 表示「永不存在的值」:抛出异常的函数、永不返回的无限循环,返回类型就是 never;它在穷举检查中也扮演关键角色。
还有 void 和 object 两个容易混淆的类型:void 只用于函数返回值,表示「没有有意义的返回值」(与 undefined 不同,调用方被禁止依赖返回值);object 表示「任意非原始值」,因为太宽泛,实践中几乎不用,取而代之的是更精确的对象类型或 interface。
示例
原始类型的标注:
const title: string = "TypeScript 教程";
const price: number = 39.5;
const published: boolean = true;
const big: bigint = 9007199254740993n;
const id: symbol = Symbol("chapter");
console.log(title, price, published, big.toString(), typeof id);
any 与 unknown 的关键差别——unknown 强迫你先检查再使用:
function parseInput(raw: unknown): string {
if (typeof raw === "string") {
return raw.trim(); // 这里 raw 已被收窄为 string
}
return String(raw);
}
console.log(parseInput(" 你好 "));
console.log(parseInput(42));
let anything: any = 123;
anything.toUpperCase(); // any:编译器不拦,运行时才会炸——避免这样写
console.log(typeof anything);
never 出现在「不可能返回」的场景:
function fail(message: string): never {
throw new Error(message);
}
function assertPositive(n: number): number {
if (n <= 0) {
fail(`期望正数,收到 ${n}`);
}
return n; // 能走到这里,n 一定是正数
}
console.log(assertPositive(3));
常见坑
- 滥用 any:每写一个 any 就关掉了一扇类型保护的门。想表达「不确定」时用 unknown,让使用点做检查。
- 用 String/Number/Boolean(大写)标注:大写形式是包装对象类型,不是原始类型,几乎所有场景都应该用小写。
- 混淆 void 和 undefined:void 函数的调用方不能使用返回值;想表达「可能返回 undefined」应该写 string | undefined 这样的联合类型。
- 以为 null/undefined 可以随便赋值:严格模式(strictNullChecks)下它们只能赋给包含自身的类型,这是空值安全的基础,后续章节专门展开。
小结
记住三类:原始类型对应 JS 值;any 放弃检查、unknown 检查后使用、never 永不出现;void 专用于「无返回值」的函数。下一章看第一类复合类型:数组与元组。