Angular:元素隐式具有 'any' 类型,因为类型为 'string' 的表达式不能用来对该类型进行索引

前端开发 2026-07-11

我知道网上有很多关于这个错误的求助帖,但我没能找到一个与我的情况接近的案例。

我正在把一个旧应用从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 时,它的类型会基于 ENIT 形成隐式类型,因此在访问时需要来自这两个对象中的某个特定键。

你可以通过显式地为 MESSAGES 指定类型来避免这个错误,如下所示:

const MESSAGES: {[langKey in Lang]: Record<string, string>} = {
    en: EN,
    it: IT
};

这让你仍然可以向 get 传递一个 string,即使它没有对应的翻译键。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章