使用类型处理复数形式
以类型安全的方式对复数形式建模。
使用类型处理复数形式 是 CoddyKit 上的免费 TypeScript Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 TypeScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 TypeScript Academy 课程共包含 4 节课。
类型安全的复数处理
语言需要复数形式:“1 个项目”与“2 个项目”。类型安全的国际化会对复数类别(例如one / other)建模,并要求提供count参数,这样您就不会忘记它。
复数类别
Intl 复数规则定义了zero、one、two、few、many、other等类别。英语只使用one和other,其他区域设置会使用更多类别。
type PluralCategory = "zero" | "one" | "two" | "few" | "many" | "other";复数消息的结构
将复数消息表示为一个以类别为键的对象。other是必需的回退形式。
type PluralMessage = {
other: string;
} & Partial<Record<Exclude<PluralCategory, "other">, string>>;
const items: PluralMessage = {
one: "{count} item",
other: "{count} items",
};区分复数消息与普通消息
消息目录同时包含普通字符串和复数对象。它们所需的参数不同,因此我们会在类型层面检测其结构。
type IsPlural<M> = M extends { other: string } ? true : false;要求数量
当消息为复数消息时,翻译参数必须包含数值型的count。我们会有条件地计算参数类型。
type PluralArgs<M> = IsPlural<M> extends true
? { count: number }
: {};
type A = PluralArgs<typeof items>; // { count: number }复数消息的类型化翻译函数
将目录查找与条件参数类型结合起来,使复数消息要求提供count,而普通消息不要求。
declare const cat: {
items: { one: string; other: string };
hello: string;
};
declare function t<K extends keyof typeof cat>(
key: K,
args: PluralArgs<(typeof cat)[K]>
): string;
t("items", { count: 3 }); // ok
t("items", {}); // Error: count required
t("hello", {}); // ok在运行时选择复数形式
在运行时,Intl.PluralRules根据数量选择类别,然后读取匹配的字符串(回退到other)。
function plural(msg: { other: string; [k: string]: string }, count: number, locale: string) {
const cat = new Intl.PluralRules(locale).select(count);
return (msg[cat] ?? msg.other);
}与插值结合
复数字符串通常也包含{count}。参数类型可以将复数要求与从所选形式中提取的插值变量相交。
type FullArgs<M> = PluralArgs<M> & ExtractVars<M>;
// count plus any {placeholders} in the message使用更丰富复数形式的区域设置
某些区域设置(例如波兰语、俄语)会使用few和many。由于PluralCategory已经包含这些类别,目录可以提供相应的键,而同一套机制会处理它们。
const ruItems = {
one: "{count} товар",
few: "{count} товара",
many: "{count} товаров",
other: "{count} товара",
};强制要求其他形式作为回退
由于other在PluralMessage中是必需的,类型系统可以保证回退形式存在,从而避免运行时没有任何复数形式匹配的情况。
为何重要
在无类型的国际化代码中,复数错误(“1 个项目们”)和忘记提供数量的情况很常见。将类别建模为类型并要求提供count,可以让正确的复数处理成为默认行为,并将缺少数量转化为编译错误。
快速检查
检查您对类型安全复数处理的掌握程度。
回顾
您将复数建模为以复数类别为键、带有必需other回退形式的对象,在类型层面检测复数消息,并通过条件类型要求数值型count参数。Intl.PluralRules在运行时选择形式,而同一套机制也可以扩展到具有更多形式的区域设置。
常见问题解答
「使用类型处理复数形式」课时是免费的吗?
是的 — 「使用类型处理复数形式」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 TypeScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 TypeScript Academy 课程共包含 4 节课。
「使用类型处理复数形式」这节课中我会学到什么?
以类型安全的方式对复数形式建模。 你通过在浏览器中直接运行的动手代码来练习 TypeScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 TypeScript Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 TypeScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「使用类型处理复数形式」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 TypeScript Academy 课中编写并运行代码吗?
能。每节 TypeScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 翻译键的类型标注
- 插值的类型安全
- 使用类型处理复数形式
- 区域设置感知的类型推断