TypeScript 中的 Number 类型详解
在 TypeScript 中,number 是表示数字的原始类型(primitive type),它对应 JavaScript 中的 Number 类型。TypeScript 的 number 类型涵盖了所有数字值,包括整数、浮点数、正负数、Infinity、NaN 等。
1. 基本用法与字面量
let age: number = 30; // 十进制整数
let height: number = 1.75; // 浮点数
let negative: number = -10; // 负数
// 不同进制的字面量(TS 支持,直接推断为 number)
let decimal: number = 100; // 十进制
let hex: number = 0xf00d; // 十六进制(0x 开头)
let binary: number = 0b1010; // 二进制(0b 开头,ES6+)
let octal: number = 0o744; // 八进制(0o 开头,ES6+)
2. 特殊数值
let infinity: number = Infinity; // 正无穷大
let negInfinity: number = -Infinity; // 负无穷大
let notANumber: number = NaN; // 非数字(Not a Number)
// 检查 NaN(不能用 === NaN)
if (isNaN(notANumber)) {
console.log("这是 NaN");
}
3. BigInt(大整数,独立类型)
注意:BigInt 不是 number 类型,它是独立的原始类型(从 ES2020 开始)。
let big: bigint = 9007199254740992n; // 末尾加 n 表示 BigInt
let bigger: bigint = BigInt("9007199254740992");
// number 和 bigint 不能直接运算
// let sum: number = 1 + big; // 错误
let safeSum: bigint = 1n + big; // OK
number的安全整数范围:-2^53 + 1到2^53 - 1(即Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER)。
4. 常用 Number 全局方法(TS 自动可用)
这些方法在 TypeScript 中类型定义完善,使用时有智能提示:
| 方法 | 描述 | 示例 |
|---|---|---|
Number.isNaN(value) | 判断是否为 NaN | Number.isNaN(NaN) → true |
Number.isFinite(value) | 判断是否为有限数 | Number.isFinite(Infinity) → false |
Number.isInteger(value) | 判断是否为整数 | Number.isInteger(42) → true |
Number.isSafeInteger(value) | 判断是否为安全整数 | Number.isSafeInteger(9007199254740991) → true |
Number.parseFloat(str) | 字符串转浮点数 | Number.parseFloat("3.14") → 3.14 |
Number.parseInt(str, radix) | 字符串转整数(可指定进制) | Number.parseInt("10", 2) → 2 |
toFixed(digits) | 保留小数位(返回字符串) | (3.14159).toFixed(2) → "3.14" |
toPrecision(precision) | 有效数字精度(返回字符串) | (3.14159).toPrecision(4) → "3.142" |
示例:
let price: number = 99.99;
let formatted: string = price.toFixed(2); // "99.99",类型为 string
let numStr: string = "123.45abc";
let parsed: number = Number(numStr); // NaN
let safeParsed: number = parseFloat(numStr); // 123.45
5. 类型转换与检查
// 显式转换
let str: string = "42";
let num: number = Number(str); // 推荐
// let num: number = +str; // 简写,但可读性差
// let num: number = parseInt(str);
// 类型守卫中使用
function double(value: string | number): number {
if (typeof value === "string") {
return parseInt(value) * 2;
}
return value * 2; // value 被缩小为 number
}
6. 字面量类型(Literal Types)与 number
可以结合字面量创建更精确的类型:
type Dice = 1 | 2 | 3 | 4 | 5 | 6;
let roll: Dice = 6; // 只能是 1~6
type StatusCode = 200 | 404 | 500;
let code: StatusCode = 200;
7. 最佳实践建议
| 建议 | 说明 |
|---|---|
优先使用 number | 日常数字运算足够 |
超大整数用 bigint | 超过安全范围时必须用 |
避免 new Number() | 创建包装对象,不推荐(用字面量) |
格式化输出用 toFixed() | 但注意返回的是 string |
判断 NaN 用 Number.isNaN() | 更准确 |
开启 strict 模式 | 避免隐式转换导致的 bug |
小结:number 类型速查
| 类型 | 表示范围 | 示例 |
|---|---|---|
number | 所有浮点数(IEEE 754 双精度) | 42, 3.14, NaN |
bigint | 任意大小整数 | 123n |
| 安全整数 | -(2^53-1) 到 2^53-1 | Number.MAX_SAFE_INTEGER |
如果您想深入了解 数字运算精度问题、数学工具函数(如 Math 对象)、自定义数字类型(如品牌类型 Brand Type),或者需要实际代码示例,请告诉我!