跳转到主要内容
模块 5 · 第 2 课(共 2)课程中的10/14~15 min
模块课程(2/2)

文字类型和断言

TypeScript 提供了高级工具来缩小变量的可能值,并在必要时强制编译器识别更具体的类型。

文字类型

文字类型表示精确的单个值(例如,特定的字符串或数字)。它们通常与联合类型结合使用:

TS
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;

light = 'red'; // OK
light = 'blue'; // Error: "blue" is not assignable to TrafficLight

类型断言 (as)

有时,您拥有 TypeScript 在编译时无法识别的类型信息。在这些情况下,您可以使用 as 关键字来使用 类型断言:

TS
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;

断言告诉编译器:“相信我,我知道这个元素是 HTMLCanvasElement”。它在运行时不执行任何检查或强制转换;它只对类型检查器有帮助。

常量断言 (as const)

当我们使用 const 声明一个对象或数组时,TypeScript 仍然允许修改其内部属性。通过在末尾添加 as const ,整个结构被冻结并变为只读,将所有属性转换为其确切的文字类型:

TS
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Error: array is read-only

模板文字类型

模板文字类型构建在 JavaScript 模板字符串之上,但在类型位置中使用。它们允许将多种文字类型组合为一种:

TS
type Size = 'small' | 'large';
type Color = 'red' | 'blue';

// Creates the union: "small-red" | "small-blue" | "large-red" | "large-blue"
type ItemId = `${Size}-${Color}`;

模板文字类型中的字符串实用程序

TypeScript 提供了特殊的实用程序类型来操作模板文字类型中的字符:

  • Capitalize<StringType>:将字符串的第一个字母大写。
  • Uncapitalize<StringType>:取消字符串的第一个字母的大写。
  • Uppercase<StringType>:将整个字符串转换为大写。
  • Lowercase<StringType>:将整个字符串转换为小写。
TS
type ActionType = 'click' | 'hover';

// Generates: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;

自己尝试一下

练习 1:方向文字并集

锻炼#ts.m5.l2.e1
尝试:0加载中...

定义一个名为 Direction 的文字类型,该类型仅接受字符串“up”、“down”、“left”或“right”。然后声明一个名为 move(dir: Direction): string 的函数,该函数返回字符串“Moving”,后跟接收到的方向。

正在加载编辑器...
显示提示

首先用 | 分隔的四个选项定义类型别名,然后声明注释参数和返回类型的 move 函数。

3 次尝试后可用的解决方案

练习 2:对 JSON.parse 进行断言

锻炼#ts.m5.l2.e2
尝试:0加载中...

JSON.parse 函数默认返回any 类型。修改 parseUser 函数,以便使用 as 关键字将 JSON.parse(json) 的结果断言为类型 { username: string }。

正在加载编辑器...
显示提示

在 JSON.parse(json) 调用之后立即添加“as { username: string }”。

3 次尝试后可用的解决方案

练习 3:事件的模板文字

锻炼#ts.m5.l2.e3
尝试:0加载中...

给定 Status 和 Action 类型,以“Status-Action”格式(例如“open-click”)定义名为 Event 的模板字符串类型。

正在加载编辑器...
显示提示

使用反引号定义类型,以及内部的 ${Status}-${Action} 语法。

3 次尝试后可用的解决方案

练习 4:带大写的模板文字类型

锻炼#ts.m5.l2.e4
尝试:0加载中...

定义文字类型事件,可以是“单击”或“悬停”。然后,使用模板文字类型声明一个表示字符串的类型 EventHandler,其格式为 on 后跟大写的事件名称(即“onClick”或“onHover”)。

正在加载编辑器...
显示提示

在模板文字内使用 Capitalize<Event> 将事件的第一个字母大写。

3 次尝试后可用的解决方案