# 原始类型-字面量类型

本节讲解基于原始值衍生的字面量类型。

# 字符串字面量

字符串字面量由单个字符表示一个类型。

// 限制事件名只能赋值为 'click'
let eventName: 'click' = 'click';

// 报错 事件名非 click
eventName = 'mouseenter';

注意这里声明的 'click' 表示类型而非值,请重温 值和类型 加深理解。

# 字符串字面量的组合

利用 | 可以组合多个字符串字面量 采用 字符串1 | 字符串2 | ... 的方式定义。

// 限制 time 参数只能为 morning,afternoon,evening ,name 只能为字符串, 函数无返回值
function greet(time: 'morning' | 'afternoon' | 'evening', name: string): void {
  console.log(`Good ${time} ${name}!`);
}

greet('morning', 'tom'); // 合法
greet('afternoon', 'jack'); // 合法
greet('evening', 'jerry'); // 合法

// 报错 输入字符串不属于限定的字符串
greet('evening1', 'jerry');

TIP

实际上 | 是联合类型符号,类似对多个类型求取并集,所以上述含义为多个字符串字面量类型的并集。后续会详细讲解联合类型

你可以阅读 String Literal Types (opens new window) 进一步理解。

# 数值字面量

和字符串字面量相似单个数值也可以表示数值字面量类型


 







// 限制变量 delayTime 的取值类型为 500 数值字面量
const delayTime: 500 = 500;

// 注意数值也可为 bigint
let a2: 500n = 500n;

// 报错, bigint 和 number 不是同种数值类型
a2 = delayTime;

注意标黑内容,为了避免运行时修改,你可以采用 const 声明数值字面量。

同样可以采用联合类型符号 | 组合数值字面量

// 掷骰子函数,限定函数返回的值只能为 1-6
function rollDice(): 1 | 2 | 3 | 4 | 5 | 6 {
  // 注意 TypeScript 类型推导返回为 number,此处采用类型断言显示申明返回类型避免报错
  return <1 | 2 | 3 | 4 | 5 | 6>Math.floor(Math.random() * 6 + 1);
}
console.log(rollDice());
console.log(rollDice());
console.log(rollDice());

# Boolean 字面量

除了使用字符串,数值作为字面量也可采用 true ,false 作为 Boolean 字面量。

type Confirm = true;
type Decline = false;

let sure: Confirm = true;
// 报错, 只能取值 true
sure = false;
sure = false;

let decline: Decline = false;
// 报错, 只能取值 false
decline = true;

同样支持采用联合类型 | 组合布尔值。

let isShow: true | false = false;
isShow = true;

# 类型别名(type aliases)

类型别名提供一个简化的类型名称,方便类型引用。 采用 type 定义类型别名。我们利用别名来简化对数值字面量类型的使用。

// 采用 type 名称 = 类型 的方式定义别名
type DiceNumber = 1 | 2 | 3 | 4 | 5 | 6;

// 此处直接使用 DiceNumber 简化数值字面量的使用
function rollDice(): DiceNumber {
  return <DiceNumber>Math.floor(Math.random() * 6 + 1);
}
console.log(rollDice());
console.log(rollDice());
console.log(rollDice());

TIP

注意 type 语句定义的是类型而非变量,这些定义会在编译为 js 文件后擦除!

# 总结

本小节我们利用原始值定义了字面量类型。知识点如下

  • 字面量类型 是有基础类型的值表示的类型,包含
    • 字符串字面量
    • 数值字面量
    • 布尔字面量
  • 联合类型
    • 可以采用 | 组合字面量类型的值
  • 类型别名简化对类型的引用,采用 type 名称 = 类型; 的方式定义

你可以阅读如下资料进一步理解: