首页 前端知识 【Typescript】Interface和type的区别;探讨为什么interface赋值给Record需要索引签名

【Typescript】Interface和type的区别;探讨为什么interface赋值给Record需要索引签名

2024-11-04 10:11:17 前端知识 前端哥 742 146 我要收藏

一、Interface与type的区别

1、Interface可以声明合并,type不行

声明同名的类型,Interface同名会合并,而type重名会报错

*注意:如果interface合并的时候,同名属性值对应的类型不兼容,则会报错!

例如:

interface P1{
  name: string;
}

interface P1{
  name: number;
}


//throw error!!!

2、类型扩展的方式不同

Interface基于extends继承扩展基类类型,而type利用 & 交集扩展

 *注意:如果定义type的交集类型时,同名属性值对应的类型存在冲突,会导致类型变为never

例如:

3、type可以被基础类型定义,而interface仅可以描述对象结构的类型

interface SomeObjs {

    //声明属性和对应类型

}


type PrimitiveTypes = number | string

二、探讨为什么interface赋值给Record需要索引签名

索引签名:对数组或者对象等索引值以及索引返回值进行通用类型定义。其索引值可接受的类型有string、number、symbol

在利用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://www.qianduange.cn//article/19936.html
标签
评论
发布的文章
大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!