TypeScript中定义字符串索引接口遭遇TS1268与TS1337错误的解决方法咨询
解决TypeScript索引签名的TS1268与TS1337错误
你碰到的这两个错误,本质是TypeScript对索引签名的参数类型有明确的规则限制:
- TS1268:索引签名的参数必须是
string、number、symbol或者模板字面量类型,你最初用${Students}时,Students如果不是合法的模板字面量输入(比如非字符串字面量联合类型)就会触发这个错误。 - TS1337:当你改用字面量联合类型
StudentCategories后,索引签名不支持直接用字面量联合类型作为参数,这时候TypeScript推荐你使用映射对象类型来替代。
可行解决方案:使用映射类型
映射类型是TypeScript专门用来基于已有类型创建新对象类型的语法,完美适配你的场景。修改后的代码如下:
type StudentCategories = 'Mature' | 'Graduate' | 'Fresher'; // 使用映射类型定义类型 type IStudentType = { [K in StudentCategories]: IStudent | IStudentMaths | IStudentPhysics; };
为什么这个方案有效?
映射类型[K in StudentCategories]会遍历StudentCategories中的每一个字面量类型,为每个键生成对应的属性,同时完全符合TypeScript的类型检查规则。和普通索引签名不同,映射类型允许你明确指定对象的键集合,同时保持类型安全。
额外扩展:可选属性或部分属性
如果你的对象可能只包含部分StudentCategories的键,可以在映射时添加?标记将属性设为可选:
type IStudentType = { [K in StudentCategories]?: IStudent | IStudentMaths | IStudentPhysics; };
或者使用Partial工具类型简化写法:
type IStudentType = Partial<{ [K in StudentCategories]: IStudent | IStudentMaths | IStudentPhysics; }>;
内容的提问来源于stack exchange,提问作者TommyD
相关产品推荐
相关产品推荐

