📜  typescript 类型特定数字 - TypeScript (1)

📅  最后修改于: 2023-12-03 15:35:24.618000             🧑  作者: Mango

Typescript 类型特定数字

在 TypeScript 中,我们可以用特定的类型来限制数字的范围和类型。这些类型包括:number, bigint, enum,以及自定义的数字类型。

number

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 会提示一个错误。

bigint

最近添加到 TypeScript 中的 bigint 类型用于表示更大范围的整数。这个类型的定义和 number 类型非常相似。

const foo: bigint = 9007199254740991n; // ok
const bar: bigint = 9007199254740992n; // 报错,数字过大

在这个例子中,我们定义了两个变量,使用 n 后缀来表示 bigint 类型。因为 JavaScript 中的 number 类型有一个固定的范围,所以当我们尝试给 bar 变量赋一个超出范围的数值时,TypeScript 会提示一个错误。

enum

枚举类型是 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 也会提示一个错误。