Interface和Type的区别

在 TypeScript 中,interface(接口)和type(类型别名)有以下一些不同点:

一、语法形式不同

interface:使用interface关键字来定义,语法格式如下:

interface Person {
    name: string;
    age: number;
}

type:通过type关键字定义,例如:

type Point = {
    x: number;
    y: number;
};

二、重复定义的处理方式不同

interface:接口可以进行重复定义,并且后续的定义会自动合并到之前的定义中。例如:

interface Animal {
    name: string;
}
interface Animal {
    age: number;
}
let dog: Animal = {
    name: "旺财",
    age: 3
};

type:类型别名不允许重复定义,重复定义同一个类型别名会直接报错,比如:

type Car = {
    brand: string;
};
// 以下代码会报错,因为重复定义了Car类型别名
type Car = {
    model: string;
};

三、实现与继承方面

interface:extends关键字进行扩展,实现类似继承的效果,要求类必须提供接口中定义的所有属性和方法(抽象类除外)。例如:

interface NameItf{
    name:string,
}
interface AgeItf{
    age: number
}
interface Person extends NameItf, AgeItf{
    height:number
}
let info:Person = {
    name: 'Lucy',
    age: 16,
    height: 163
}

type:类型别名本身不具备类似接口那样让类去实现的机制,不过可以通过交叉类型(&)等方式来模拟类似接口继承合并属性的效果,例如:

type Shape = {
    getArea(): number;
};

type ColoredShape = Shape & {
    color: string;
};

四、使用场景倾向

interface:
更适合用于定义对象的 “形状”,尤其是在面向对象编程中,当需要定义一组类需要遵循的规范(通过实现接口),或者对接口进行扩展来描述更具体的对象结构时非常方便,常用于公共 API 的定义等场景,方便代码的扩展和不同模块之间的协作遵循统一规范。
type:
适合创建一些复杂的类型组合、联合类型,或者对类型进行精确的别名定义来增强代码可读性(比如一些复杂的函数类型、交叉类型、联合类型等场景),在需要进行高级类型操作以及处理那些并非面向对象意义上的 “接口规范” 场景下使用更合适。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容