TypeScript: TypeScript 基础类型
最后更新:2026-08-26
TypeScript 的类型系统从七种基础类型开始——掌握它们,就掌握了类型注解的"字母表"。
1. 七种基础类型
TypeScript 继承了 JavaScript 的七种基础类型,并为每种类型提供了类型注解语法:
| 类型 | 说明 | 示例值 |
|---|---|---|
string |
字符串 | "hello", 'world', `模板` |
number |
数字(整数和小数) | 42, 3.14, 0xFF |
boolean |
布尔值 | true, false |
null |
空值 | null |
undefined |
未定义 | undefined |
symbol |
唯一标识符 | Symbol("id") |
bigint |
大整数 | 100n, BigInt(9007199254740991) |
(1) string 字符串
字符串可以用单引号、双引号或反引号(模板字符串)表示:
TYPESCRIPT
let firstName: string = "Charlie";
let lastName: string = '王';
let greeting: string = `你好, ${firstName} ${lastName}`;
模板字符串(反引号)支持嵌入变量和表达式,这是 ES6 引入的语法,TypeScript 完全支持。
(2) number 数字
TypeScript 和 JavaScript 一样,不区分整数和小数——它们都是 number 类型:
TYPESCRIPT
let age: number = 25; // 整数
let price: number = 9.99; // 小数
let hex: number = 0xFF; // 十六进制
let binary: number = 0b1010; // 二进制
let octal: number = 0o744; // 八进制
💡 提示: 如果你的计算涉及超过
Number.MAX_SAFE_INTEGER(2^53 - 1)的超大整数,应该用 bigint 而不是 number,否则会丢失精度。
(3) boolean 布尔值
只有两个值:true 和 false。常用于条件判断和开关标志:
TYPESCRIPT
let isActive: boolean = true;
let hasPermission: boolean = false;
▶ 示例:基础类型注解
TYPESCRIPT
// 定义不同类型的变量
let title: string = "TypeScript 入门";
let version: number = 5.3;
let isPublished: boolean = true;
console.log("课程:" + title);
console.log("版本:" + version);
console.log("已发布:" + isPublished);
输出:
TEXT
📖 仅展示
课程:TypeScript 入门
版本:5.3
已发布:true
2. null 和 undefined
null 和 undefined 在 TypeScript 中既是值,也是类型。它们的区别看似微妙,但在类型系统中很重要。
(1) 含义区别
| 类型 | 含义 | 什么时候出现 |
|---|---|---|
undefined |
"还没有赋值" | 变量声明但未初始化、函数没有返回值 |
null |
"有意为空" | 开发者主动设置,表示"这里没值" |
(2) 类型注解
TYPESCRIPT
let notAssigned: undefined = undefined;
let emptyValue: null = null;
⚠️ 注意: 默认情况下,
null 和 undefined 可以赋值给任何类型的变量(比如 let name: string = null 是合法的)。但开启 strictNullChecks 后,它们只能赋值给 null/undefined 类型或联合类型。强烈建议开启严格空检查。
(3) strictNullChecks 的影响
TYPESCRIPT
// strictNullChecks: false(默认宽松模式)
let name: string = null; // ✅ 不报错,但运行时 name.toUpperCase() 会崩溃
// strictNullChecks: true(严格模式,推荐)
let name2: string = null; // ❌ 错误:不能将 null 赋值给 string
let name3: string | null = null; // ✅ 正确:显式声明可能为 null
📌 重点:
strict: true 包含了 strictNullChecks: true。严格模式下,任何可能为 null/undefined 的值都必须显式声明,这能避免 90% 的"undefined is not a function"运行时错误。
3. symbol 类型
symbol 是 ES6 引入的原始类型,用于创建全局唯一标识符。每次调用 Symbol() 都会生成一个独一无二的值:
TYPESCRIPT
let id1: symbol = Symbol("id");
let id2: symbol = Symbol("id");
console.log(id1 === id2); // false —— 即使描述相同,每个 symbol 都是唯一的
▶ 示例:symbol 作为对象的唯一键
TYPESCRIPT
let uniqueKey: symbol = Symbol("secret");
let user: object = {
name: "Diana",
age: 20
};
// 用 symbol 作为属性键,不会和其他属性冲突
user[uniqueKey] = "隐藏数据";
console.log(user.name); // 正常访问
console.log(user[uniqueKey]); // 访问 symbol 键的值
输出:
TEXT
📖 仅展示
Diana
隐藏数据
💡 提示: symbol 在日常开发中用得不多,主要出现在高级场景(如迭代器协议
Symbol.iterator、框架内部实现等)。初学者了解"每次 Symbol() 生成唯一值"就够了。
4. bigint 类型
bigint 是 ES2020 引入的类型,用于表示超过 number 安全范围的大整数。数字后面加 n 就是 bigint:
TYPESCRIPT
let big1: bigint = 100n; // 字面量写法
let big2: bigint = BigInt(9007199254740991); // 函数写法
// number 的安全整数上限
let maxSafe: number = Number.MAX_SAFE_INTEGER; // 9007199254740991
let overflow: number = 9007199254740992; // 超出安全范围,精度丢失!
// bigint 不会丢失精度
let safe: bigint = 9007199254740992n; // 精确表示
🔥 易错:
bigint 和 number 不能混合运算——100n + 50 会报错。必须先统一类型:Number(100n) + 50 或 100n + BigInt(50)。
▶ 示例:bigint 精度对比
TYPESCRIPT
// number 超出安全范围后精度丢失
let a: number = 9007199254740992;
let b: number = 9007199254740993;
console.log(a === b); // true!两个不同的数居然相等
// bigint 精确表示
let c: bigint = 9007199254740992n;
let d: bigint = 9007199254740993n;
console.log(c === d); // false —— 正确区分
输出:
TEXT
📖 仅展示
true
false
5. 类型注解的省略与最佳实践
(1) 什么时候必须写类型注解
| 场景 | 是否必须写 | 原因 |
|---|---|---|
| 变量无初始值 | ✅ 必须 | 否则 TypeScript 无法推断类型 |
| 函数参数 | ✅ 必须 | 参数没有初始值供推断 |
| 函数返回值 | ⚠️ 建议写 | TypeScript 能推断,但显式标注更清晰 |
| 变量有初始值 | ❌ 可省略 | TypeScript 根据初始值推断 |
(2) 最佳实践
TYPESCRIPT
// ✅ 推荐:变量有初始值时省略类型注解(类型推断足够)
let name = "Charlie";
let age = 20;
// ✅ 推荐:函数参数和返回值显式标注
function greet(name: string): string {
return "你好, " + name;
}
// ✅ 推荐:无初始值时显式标注
let userId: number;
let isActive: boolean;
// ❌ 不推荐:有初始值还写注解(冗余)
let name2: string = "Charlie"; // 多余——TypeScript 已经推断出来了
❓ 常见问题
Q TypeScript 有没有 float 或 double 类型?
A 没有。和 JavaScript 一样,TypeScript 只有一个 number 类型,涵盖整数和小数。JavaScript 的数字都是 64 位双精度浮点数(IEEE 754),所以 1 和 1.0 在类型上是完全一样的。
Q null 和 undefined 有什么实际区别?什么时候用哪个?
A undefined 表示"还没赋值"(系统自动产生的状态),null 表示"有意为空"(开发者主动设置的值)。实际开发中,表示"没有值"时推荐用 null——因为 undefined 可能是忘记赋值导致的,null 则是明确的选择。
Q bigint 类型平时用得多吗?
A 不多。绝大多数场景 number 够用(安全整数范围到 2^53-1 ≈ 9000万亿)。bigint 主要用在加密算法、大数计算、数据库 bigint 字段等场景。初学者知道它存在就行,用到时再深入。
Q 类型注解写多了会不会影响性能?
A 完全不会。类型注解只在编译时存在,编译后的 JavaScript 代码中所有类型信息都被擦除了,运行时零开销。就像注释不会让程序变慢一样。
📖 小节
- TypeScript 有七种基础类型:string、number、boolean、null、undefined、symbol、bigint
- number 不区分整数和小数;bigint 用于超大整数,和 number 不能混合运算
- strict 模式下 null/undefined 不能随意赋值给其他类型,需要用联合类型(
string | null) - symbol 生成全局唯一标识符,主要用在高级场景
- 变量有初始值时类型注解可省略(类型推断),函数参数和无初始值变量必须标注
📝 作业
- 基础题(难度⭐):声明五个变量分别对应五种常用类型(string、number、boolean、null、undefined),赋上合适的值,用
console.log逐个输出。 - 进阶题(难度⭐⭐):写一个函数
formatPrice(price: number, currency: string): string,把数字价格格式化为带货币符号的字符串,例如formatPrice(99.5, "¥")返回"¥99.5"。 - 挑战题(难度⭐⭐⭐):验证 number 的精度问题——写代码比较
0.1 + 0.2和0.3是否相等,解释结果。然后用 bigint 计算两个超过Number.MAX_SAFE_INTEGER的大整数之和,验证 bigint 不丢精度。