TypeScript中接口赋值给接口报错、type类型赋值给接口不报错的原因是什么?
核心原因
这是TypeScript中interface(接口)和type(类型别名)在隐式索引签名兼容性判定上的规则差异导致的,具体逻辑如下:
场景1(interface定义B)报错原因
- 接口本身支持声明合并特性:你可以在代码的其他位置再次定义同名的
interface B,追加新的属性和方法。 - TypeScript无法保证后续扩展的
B的所有属性值都符合A的索引签名[key: string]: string要求,因此不会默认给interface B隐式添加索引签名,直接赋值就会触发「缺少索引签名」的报错。 - 如果要让interface版本的B可以赋值给A,需要显式给B加上索引签名:
interface B { name: string; [key: string]: string; // 显式声明索引签名 }
场景2(type定义B)赋值成功原因
- 类型别名不存在声明合并的能力,一旦定义完成,它的属性和类型就是固定的,无法再扩展。
- TypeScript可以完整遍历
type B的所有属性,确认它的所有属性值都是string类型,完全符合A的索引签名要求,因此会隐式判定B兼容A的索引签名约束,赋值不会报错。 - 注意:如果
type B里存在不符合索引签名value类型的属性,比如加一个age: number,那赋值给A同样会报错,和interface的判定逻辑是一致的,只有所有属性都符合索引签名要求时才会触发type的隐式兼容判定。
内容的提问来源于stack exchange,提问作者why do i have so much question
相关产品推荐
相关产品推荐

