📅  最后修改于: 2023-12-03 15:35:24.618000             🧑  作者: Mango
在 TypeScript 中,我们可以用特定的类型来限制数字的范围和类型。这些类型包括:number
, bigint
, enum
,以及自定义的数字类型。
number
是 TypeScript 中最基本的数字类型,它可以表示整数和浮点数。但是,在 TypeScript 中,我们可以使用一些特定的类型来限制数字的范围和类型。
字面量类型是由具体的数值字面量组成的。例如:
type Num = 1 | 2 | 3;
const foo: Num = 4; // 报错,4 不是 1、2、3 中的任意一个
在这个例子中,我们定义了一个新的类型 Num
,它只包含了字面量类型 1、2、3。因此,当我们将一个不在这个范围内的数字赋给 foo
时,TypeScript 会提示一个错误。
使用 TypeScript 中的特定类型,我们可以限制数字的范围。
type PositiveNum = number & { __positive: true };
const foo: PositiveNum = -1; // 报错,负数不是正数
在这个例子中,我们定义了一个新的类型 PositiveNum
,它实际上是一个交叉类型,包含了 number
和一个文本标记 __positive
,这个标记用来表示这个数字类型必须是正数。因此,当我们将一个负数赋给 foo
时,TypeScript 会提示一个错误。
最近添加到 TypeScript 中的 bigint
类型用于表示更大范围的整数。这个类型的定义和 number
类型非常相似。
const foo: bigint = 9007199254740991n; // ok
const bar: bigint = 9007199254740992n; // 报错,数字过大
在这个例子中,我们定义了两个变量,使用 n
后缀来表示 bigint
类型。因为 JavaScript 中的 number
类型有一个固定的范围,所以当我们尝试给 bar
变量赋一个超出范围的数值时,TypeScript 会提示一个错误。
枚举类型是 TypeScript 中的另一个特定类型,用于定义一组相关的命名常量。
enum Direction {
Up,
Down,
Left,
Right,
}
const foo: Direction = Direction.Up; // ok
const bar: Direction = "Up"; // 报错,应该使用 Direction.Up 而不是字符串
在这个例子中,我们定义了一个枚举类型 Direction
, 它包含了四个常量 Up
, Down
, Left
, Right
。我们可以在变量中使用枚举类型来限制它的值。当我们尝试给 bar
变量赋一个字符串时,TypeScript 会提示一个错误。
我们还可以使用 TypeScript 的接口和类型别名来定义自己的数字类型,以满足特定的需求。
interface PositiveNumber {
__positive: true;
__value: number;
}
type NumericString = string & { __numeric: true };
const foo: PositiveNumber = { __positive: true, __value: 5 }; // ok
const bar: PositiveNumber = { __positive: true, __value: -5 }; // 报错,负数不是正数
const baz: NumericString = "123"; // ok
const qux: NumericString = "abc"; // 报错,字符串不是数字
在这个例子中,我们分别定义了 PositiveNumber
接口和 NumericString
类型别名。我们使用接口来定义一个数字必须是正数,并使用类型别名来限制一个字符串必须是数字。当我们尝试给 bar
变量赋一个负数时,TypeScript 会提示一个错误。当我们尝试给 qux
变量赋一个非数字字符串时,TypeScript 也会提示一个错误。