TypeScript中如何在类型检查前校验动态生成的翻译键是否合法
校验翻译键有效性的实现方案
以下两种方案可以满足你的需求,你可以根据使用场景选择:
方案1:TypeScript 静态类型校验(编译阶段生效,无运行时开销)
该方案可以在TS类型检查阶段就拦截非法参数,不需要等到代码运行就能发现错误,适合所有partialKey为代码内写死的场景。
要求TS版本 >= 4.1(支持模板字面量类型),实现代码如下:
// 加as const固定对象键的字面量类型,避免被自动收窄为string const translations = { msg_hello: 'Hello', msg_bye: 'Bye' } as const; // 工具类型:移除字符串前缀 type RemovePrefix<T extends string, Prefix extends string> = T extends `${Prefix}${infer Suffix}` ? Suffix : never; // 提取所有合法的partialKey联合类型 type ValidPartialKey = RemovePrefix<keyof typeof translations, 'msg_'>; // 限制入参只能是合法的partialKey const generateTranslation = (partialKey: ValidPartialKey): keyof typeof translations => { return `msg_${partialKey}`; }
校验效果:
generateTranslation('hello'); // 语法正常,无报错 generateTranslation('no'); // TS直接抛出类型错误:类型"no"的参数不能赋给类型"hello" | "bye"的参数
方案2:运行时校验(适配动态传参场景)
如果你的partialKey是从接口、用户输入等动态来源获取,无法在编译阶段确定值,可以添加运行时校验做双重保障,避免非法键进入业务逻辑:
const translations = { msg_hello: 'Hello', msg_bye: 'Bye' } as const; const generateTranslation = (partialKey: string): keyof typeof translations => { const generatedKey = `msg_${partialKey}` as keyof typeof translations; // 校验生成的键是否存在于翻译对象中 if (generatedKey in translations) { return generatedKey; } // 非法键处理逻辑,可根据需求调整:抛错/返回默认键/打印警告 throw new Error(`非法翻译键:${generatedKey}`); }
场景选择建议
- 纯静态传参场景:只用方案1即可,零运行时成本,编译阶段就能发现所有错误
- 存在动态传参场景:建议两种方案结合使用,静态层校验写死参数,运行时层校验动态参数,覆盖所有边界情况
内容的提问来源于stack exchange,提问作者dogisdev
相关产品推荐
相关产品推荐

