【Typescript】Interface和type的区别;探讨为什么interface赋值给Record需要索引签名
一、Interface与type的区别
1、Interface可以声明合并,type不行
声明同名的类型,Interface同名会合并,而type重名会报错
2、类型扩展的方式不同
Interface基于extends继承扩展基类类型,而type利用 & 扩展
3、type可以被基础类型定义,而interface仅可以描述对象结构的类型
interface SomeObjs {
//声明属性和对应类型
}
type PrimitiveTypes = number | string
二、探讨为什么interface赋值给Record需要索引签名
在利用type Record定义一系列属性和对应类型的时候,interface需要添加索引签名而type不用
例如:
interface MyInterface {
foo : string;
}
type MyType = {
foo : string;
}
const obj1 : MyInterface = { foo : 'obj1'}
const obj2 : MyType = { foo : 'obj2' }
let record : Record<string,string> = {}
//正常编译
record = obj1
//报错:index signature missing
record = obj2
可以理解为:
Record限制了属性的类型和值的类型。而Interface由于可以声明合并,因此此刻的MyInterface并不一定是最终的类型结构,后续的合并可能会存在类型不与Record一致的情况。
而type则不存在这类隐患!
因此为和Record匹配,MyInterface应添加索引签名,对属性和值的类型进行检查,写为:
interface MyInterface {
foo : string;
[key : string] : string;
}
原文地址:https://blog.csdn.net/weixin_57208584/article/details/140450178
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!