# 原始类型-字面量类型
本节讲解基于原始值衍生的字面量类型。
# 字符串字面量
字符串字面量由单个字符表示一个类型。
// 限制事件名只能赋值为 '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 名称 = 类型;的方式定义
你可以阅读如下资料进一步理解: