布尔字面量与字面量推断
理解 TypeScript 如何扩展或收窄字面量推断结果。
布尔字面量与字面量推断 是 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 反馈 — 无需本地设置。