TypeScript Academy · 课时

布尔字面量与字面量推断

理解 TypeScript 如何扩展或收窄字面量推断结果。

第 2 / 4 课13 个步骤

布尔字面量与字面量推断 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。

布尔字面量类型

boolean 类型实际上是联合类型 true | false。其中每一个都是布尔字面量类型:只允许一个特定布尔值的类型。

let yes: true = true;
let no: false = false;
console.log(yes, no);
// yes = false; // Error: false not assignable to true

联合类型中的布尔字面量

布尔字面量与其他字面量结合使用时非常有用,可以表示带有区别标志的结果,例如将成功标志与数据形状组合起来。

type Result =
  | { ok: true; value: number }
  | { ok: false; error: string };

const r: Result = { ok: true, value: 42 };
console.log(r);

类型拓宽

初始化变量时,TypeScript 会决定要推断哪种类型。有时它会保留确切的字面量,有时会拓宽为通用类型。理解这一点是获得可预测类型的关键。

const exact = 'hello'; // type: 'hello' (literal)
let broad = 'hello';   // type: string (widened)
console.log(exact, broad);

let 拓宽为通用类型

由于 let 变量可以重新赋值,TypeScript 会推断出通用类型,以允许将来进行赋值。let 字符串的初始类型是 string,而不是该字面量。

let mood = 'happy'; // inferred as string
mood = 'sad';       // allowed
mood = 'tired';     // allowed
console.log(mood);

const 保留字面量

const 永远不能重新赋值,因此 TypeScript 会推断出最具体的类型,也就是字面量。这就是为什么 const greeting = 'hi' 的类型是 'hi',而不是 string。

const greeting = 'hi'; // type: 'hi'

type Greeting = typeof greeting; // 'hi'
const other: Greeting = 'hi';
console.log(other);

数字和布尔值的拓宽

同样的规则也适用于数字和布尔值。const 会将 42 或 true 保留为字面量;let 则会拓宽为 number 或 boolean。

const n = 42;   // type: 42
const b = true; // type: true
let m = 42;     // type: number
let c = true;   // type: boolean
console.log(n, b, m, c);

为什么存在类型拓宽

类型拓宽让日常代码更易于使用。如果每个 let count = 0 都被标注为字面量 0,您就无法递增它。类型拓宽让可重新赋值的变量能够自然地工作。

let count = 0; // widened to number
count = count + 1;
count = 10;
console.log('Count:', count);

使用注解强制保留字面量

有时您希望 let 保持字面量类型。添加显式的字面量类型注解后,TypeScript 会保持类型收窄,同时仍允许您在该联合类型范围内重新赋值。

let status: 'on' | 'off' = 'on';
status = 'off'; // allowed
console.log(status);
// status = 'paused'; // Error

对象属性中的类型拓宽

对象字面量属性默认也会拓宽。即使对象使用 const 声明,可变属性仍会获得通用类型,因为属性本身可以重新赋值。

const config = { mode: 'dark' };
// config.mode has type string, not 'dark'
config.mode = 'light';
console.log(config.mode);

函数中的字面量推断

函数返回值也会被推断。即使函数返回一个 const 字面量值,除非您为其添加注解或在签名中使用字面量类型,否则它的返回类型仍会拓宽为通用类型。

function getMode(): 'dark' | 'light' {
  return 'dark';
}

const m = getMode(); // type: 'dark' | 'light'
console.log(m);

选择 literal 类型还是通用类型

经验法则是:需要精确值(例如 config 键和判别字段)时,请使用 const 或显式的字面量注解。对于普通的可变变量,可以让类型自然扩宽。了解变量会得到哪种类型,有助于避免令人意外的可赋值错误。

const KEY = 'apiUrl';     // literal 'apiUrl'
let retries = 3;          // number
let level: 'low' | 'high' = 'low'; // pinned literal
console.log(KEY, retries, level);

快速检查

测试您对类型扩宽和字面量推断的理解。

回顾:literal 推断

要点:

  • true 和 false 是字面量类型;boolean 等同于 true | false。
  • let 会扩宽为通用类型(string、number、boolean)。
  • const 会保留确切的字面量类型。
  • 使用字面量类型进行注解,可以将 let 固定为较窄的联合类型。

接下来,我们将使用 as const 明确表达不可变性。

const literal = 'fixed'; // 'fixed'
let widened = 'fixed';   // string
let pinned: 'a' | 'b' = 'a';
console.log(literal, widened, pinned);
免费开始

用 AI 导师学习 TypeScript — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
101
课程
352

常见问题解答

「布尔字面量与字面量推断」课时是免费的吗?

是的 — 「布尔字面量与字面量推断」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。

「布尔字面量与字面量推断」这节课中我会学到什么?

理解 TypeScript 如何扩展或收窄字面量推断结果。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 TypeScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「布尔字面量与字面量推断」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 TypeScript Academy 课中编写并运行代码吗?

能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 字符串与数值字面量类型
  2. 布尔字面量与字面量推断
  3. 使用 as const 进行 const 断言
  4. 将字面量组合为联合类型
← 返回 TypeScript Academy