模块课程(2/2)
文字类型和断言
TypeScript 提供了高级工具来缩小变量的可能值,并在必要时强制编译器识别更具体的类型。
文字类型
文字类型表示精确的单个值(例如,特定的字符串或数字)。它们通常与联合类型结合使用:
type TrafficLight = 'red' | 'yellow' | 'green';
let light: TrafficLight;
light = 'red'; // OK
light = 'blue'; // Error: "blue" is not assignable to TrafficLight类型断言 (as)
有时,您拥有 TypeScript 在编译时无法识别的类型信息。在这些情况下,您可以使用 as 关键字来使用 类型断言:
const myCanvas = document.getElementById('main_canvas') as HTMLCanvasElement;断言告诉编译器:“相信我,我知道这个元素是 HTMLCanvasElement”。它在运行时不执行任何检查或强制转换;它只对类型检查器有帮助。
常量断言 (as const)
当我们使用 const 声明一个对象或数组时,TypeScript 仍然允许修改其内部属性。通过在末尾添加 as const ,整个结构被冻结并变为只读,将所有属性转换为其确切的文字类型:
const colors = ['red', 'green', 'blue'] as const;
// colors[0] = "yellow"; // Error: array is read-only模板文字类型
模板文字类型构建在 JavaScript 模板字符串之上,但在类型位置中使用。它们允许将多种文字类型组合为一种:
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>:将整个字符串转换为小写。
type ActionType = 'click' | 'hover';
// Generates: "onClick" | "onHover"
type EventHandlers = `on${Capitalize<ActionType>}`;自己尝试一下
练习 1:方向文字并集
定义一个名为 Direction 的文字类型,该类型仅接受字符串“up”、“down”、“left”或“right”。然后声明一个名为 move(dir: Direction): string 的函数,该函数返回字符串“Moving”,后跟接收到的方向。
显示提示
首先用 | 分隔的四个选项定义类型别名,然后声明注释参数和返回类型的 move 函数。
3 次尝试后可用的解决方案
练习 2:对 JSON.parse 进行断言
JSON.parse 函数默认返回any 类型。修改 parseUser 函数,以便使用 as 关键字将 JSON.parse(json) 的结果断言为类型 { username: string }。
显示提示
在 JSON.parse(json) 调用之后立即添加“as { username: string }”。
3 次尝试后可用的解决方案
练习 3:事件的模板文字
给定 Status 和 Action 类型,以“Status-Action”格式(例如“open-click”)定义名为 Event 的模板字符串类型。
显示提示
使用反引号定义类型,以及内部的 ${Status}-${Action} 语法。
3 次尝试后可用的解决方案
练习 4:带大写的模板文字类型
定义文字类型事件,可以是“单击”或“悬停”。然后,使用模板文字类型声明一个表示字符串的类型 EventHandler,其格式为 on 后跟大写的事件名称(即“onClick”或“onHover”)。
显示提示
在模板文字内使用 Capitalize<Event> 将事件的第一个字母大写。
3 次尝试后可用的解决方案