为何泛型类型无法作为对象索引?(TS2536错误)
错误原因
TS2536错误的核心是泛型T未被约束为ExtendedLanguageFields的合法键类型,导致TypeScript编译器无法确认field参数能安全索引extendedLanguageFieldsText[langcode]对象。即便你尝试将field断言为keyof ExtendedLanguageFields,但由于subtitleToGet的类型依赖T(keyof ExtendedLanguageFields[T]["subtitles"]),缺失泛型约束会让编译器无法建立field与后续索引操作的类型关联,因此断言无法彻底解决类型校验问题。
解决方法
1. 给泛型添加明确约束
为泛型T添加extends keyof ExtendedLanguageFields约束,强制field必须是ExtendedLanguageFields的合法键,让编译器能完整追踪类型关联:
const extendedFieldTextGetter = <T extends keyof ExtendedLanguageFields>( field: T, subtitleToGet: keyof ExtendedLanguageFields[T]["subtitles"], subtitleValue: ContentOptions ) => { try { const valueToReturn = extendedLanguageFieldsText[langcode][field]["subtitles"][subtitleToGet][subtitleValue]; return valueToReturn; } catch (error) { if (error instanceof Error) { console.warn("Caught error on Extended Field Text Getter:"); console.error(error.message); } } };
2. 确保langcode的类型合法性
如果langcode是动态变量,需要约束其类型为extendedLanguageFieldsText的顶级键类型,保证extendedLanguageFieldsText[langcode]的结构与ExtendedLanguageFields完全对齐:
// 示例:假设extendedLanguageFieldsText的键是语言代码类型 const langcode: keyof typeof extendedLanguageFieldsText = "en";
原理说明
添加泛型约束后,编译器能明确T是ExtendedLanguageFields的合法键,进而确认extendedLanguageFieldsText[langcode][field]必然包含subtitles属性,同时subtitleToGet的类型也与当前field对应的subtitles键完全匹配,整个索引链的类型校验逻辑完整,TS2536错误会自动消失。
内容的提问来源于stack exchange,提问作者AmodeusR

