Angular:元素隐式具有 'any' 类型,因为类型为 'string' 的表达式不能用来对该类型进行索引
我知道网上有很多关于这个错误的求助帖,但我没能找到一个与我的情况接近的案例。
我正在把一个旧应用从Angular 6.1.10和 TypeScript 2.9.2迁移到Angular 17.0.0和 TypeScript 5.2.2。
该应用使用在定义标签及其翻译的文件夹下的index.ts中声明的这段代码来处理两种语言之间的翻译:
import { EN } from './en';
import { IT } from './it';
export const MESSAGES = {
en: EN,
it: IT
};
export type Lang = 'en' | 'it';
export type MessageKey = keyof typeof EN;
在I18nService里,有一个方法是在给定键时返回它的翻译:
get(key: string, params?: any): string {
let text = (MESSAGES[this.lang] && MESSAGES[this.lang][key]) ||
(MESSAGES['en'] && MESSAGES['en'][key]) ||
key;
if (params) {
Object.keys(params).forEach(p => {
text = text.replace(`{{${p}}}`, params[p]);
});
}
return text;
}
错误出现在声明text的那一行:将 "key" 作为第二个索引来访问MESSAGES矩阵已不再被允许。
我试着使用 "key as keyof typeof MESSAGES",但这并不正确。正确的语法应该是?
解决方案
问题在于以这样的方式声明 MESSAGES 时,它的类型会基于 EN 和 IT 形成隐式类型,因此在访问时需要来自这两个对象中的某个特定键。
你可以通过显式地为 MESSAGES 指定类型来避免这个错误,如下所示:
const MESSAGES: {[langKey in Lang]: Record<string, string>} = {
en: EN,
it: IT
};
这让你仍然可以向 get 传递一个 string,即使它没有对应的翻译键。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。