解读Typescript中interface和type的用法及区别

 更新时间:2025年02月05日 09:01:12   作者:¢C-TiAmo  
在TypeScript中,`interface`和`type`都可以用来定义自定义类型,但它们在语法、声明合并、可扩展性、兼容性、类型注解和类型别名、访问修饰符、联合类型与交叉类型、实现接口和类型别名、映射类型、泛型参数位置、扩展对象类型以及调用签名和构造函数等方面存在一些差异

Typescript中interface和type区别

在typeScript中,“interface”和“type”都是用来定义自定义类型的关键字,他们在以下差异,用法上的一些区别(欢迎大家继续补充……)

1. 语法差异

  • 'interface’使用关键字’interface’定义,例如:interface Person { name: string; }
  • 'type’使用关键字’type’定义,例如:type Person = { name: string; }

2.声明合并(Merging)的能力

  • 'interface’具有声明合并的能力,允许多个同名的接口进行合并,通过这样的方式可以扩展接口的成员定义。
  • 'type’不具备声明合并的能力,多次定义同一个类型会报错

3.可扩展性

  • 'interface’可以使用关键字’extends’继承另一个接口,实现接口的复用和扩展。
  • 'type’可以使用交叉类型(Intersection Types)进行复用和扩展,但不能使用extends关键字继承。

4.兼容性

  • 'interface’在进行类型兼容性检查时,会进行"兼容性递归检查",只要目标类型满足源类型的成员要求,就认为类型兼容。
  • 'type’没有进行"兼容性递归检查",只有精确匹配才被认为是兼容。

5.类型注解和类型别名

  • 'interface’可以用于定义函数类型、类类型等复杂类型的注解。
  • 'type’可以用于定义任意类型的别名,可以简化复杂类型的书写。

6.访问修饰符

  • 'interface’可以在属性和方法上使用公共(public),私有(private)和受保护(protected)等访问修饰符。
  • 'type’不能指定访问修饰符,它假定所有成员都是公共的。

7.联合类型与交叉类型

  • 'type’可以使用联合类型(Union Types)和交叉类型(Intersection Types)来组合多个类型。
  • 'interface’没有直接支持联合类型和交叉类型的语法,但可以通过继承和声明合并的方式实现类似的效果。

8.实现接口和类型别名

  • 'interface’可以被类实现(implements)来强制约束类的结构。
  • 'type’不能直接被类实现,它更适合作为类型别名来简化复杂类型的定义。

9.映射类型

  • 'type’可以使用映射类型来根据已有类型生成新的类型。
  • 'interface’不支持映射类型。
type Options<T> = {
  [K in keyof T]: boolean;
};

interface PersonOptions {
  name: boolean;
  age: boolean;
}

// 使用映射类型
type Result = Options<PersonOptions>;
// Result 的类型为 { name: boolean, age: boolean }

// 不能使用映射类型
// interface ResultInterface extends Options<PersonOptions> {}

10.范型参数位置

  • 在范型参数位置上,'type’可以出现在任意位置,且可以交叉和联合多个类型。
  • 在范型参数位置上,'interface’只能出现在类型别名的右侧。
type Tuple = [number, string];

type NumberArray = Array<number>;

type Union = number | string;

// 有效的定义
type MyType<T> = { value: T };
type MyType2 = MyType<number>;

// 有效的定义
interface MyInterface<T> {
  value: T;
}
type MyInterface2 = MyInterface<number>;

// 无效的定义
// interface MyInterface<T> {
//   value: T;
// }
// interface MyInterface2 extends MyInterface<number> {}

11.扩展对象类型

  • 'interface’可以通过声明合并的方式扩展已有的对象类型,从而添加新的属性或方法。
  • 'type’需要使用交叉类型来实现对象类型的扩展。
interface Person {
  name: string;
}

interface ExtendedPerson extends Person {
  age: number;
}

// 使用声明合并进行扩展
const person: ExtendedPerson = {
  name: 'John',
  age: 25,
};

type Person = {
  name: string;
};

type ExtendedPerson = Person & {
  age: number;
};

// 使用交叉类型进行扩展
const person: ExtendedPerson = {
  name: 'John',
  age: 25,
};

12.调用签名和构造函数

  • 'interface’可以定义调用签名来描述函数类型,也可以定义构造函数签名来描述类的构造函数。
  • 'type’可以使用函数类型和构造函数类型别名来描述函数类型和类的构造函数。
interface Greeting {
  (name: string): string;
}

interface Person {
  new (name: string): Person;
  name: string;
  sayHello(): void;
}

// 定义调用签名和构造函数签名
const greeting: Greeting = (name) => `Hello, ${name}!`;

class PersonClass implements Person {
  constructor(public name: string) {}
  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

type Greeting = (name: string) => string;

type Person = {
  new (name: string): Person;
  name: string;
  sayHello(): void;
};

// 使用类型别名
const greeting: Greeting = (name) => `Hello, ${name}!`;

class PersonClass implements Person {
  constructor(public name: string) {}
  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Electron将Web应用打包成桌面软件

    使用Electron将Web应用打包成桌面软件

    本文为前端开发者提供了一站式指南,学习如何使用Electron将Web应用打包成桌面软件,涵盖主进程与渲染进程概念、BrowserWindow配置、安全模型及Fastify服务器嵌入等,通过实例详细解析Electron核心概念及安全配置,帮助开发者快速掌握Electron开发技巧
    2026-05-05
  • 基于JS实现翻书效果的页面切换样式

    基于JS实现翻书效果的页面切换样式

    在项目开发中经常遇到翻书的页面切换效果,基于js代码怎么实现的呢?今天小编给大家分享基于JS实现翻书效果的页面切换样式,需要的朋友参考下吧
    2017-02-02
  • js正则表达式匹配数字字母下划线等

    js正则表达式匹配数字字母下划线等

    本文给大家分享的是使用正则表达式检测只含有汉字、数字、字母、下划线等示例,非常的简单实用,这里推荐给大家,有需要的小伙伴参考下。
    2015-04-04
  • Bpmn.js activiti 流程编辑器详细教程

    Bpmn.js activiti 流程编辑器详细教程

    流程编辑器是一种用于创建、编辑和管理流程图的工具,它提供了一个可视化的界面,使用户能够以图形化的方式定义和配置流程的各个步骤、条件和流程间的关系,说明关于bpmn.js的一些事件, 通过本文你可以了解到,感兴趣的朋友一起看看吧
    2023-10-10
  • javascript 简单抽屉效果的实现代码

    javascript 简单抽屉效果的实现代码

    javascript 简单抽屉效果的实现代码,需要的朋友可以参考下,大家自行测试。
    2010-03-03
  • JavaScript中数组的22种方法必学(推荐)

    JavaScript中数组的22种方法必学(推荐)

    这篇文章主要介绍了JavaScript中数组的22种方法必学(推荐)的相关资料,需要的朋友可以参考下
    2016-07-07
  • JavaScript中的对象和原型(一)

    JavaScript中的对象和原型(一)

    大家都知道在js中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。所以大家要了解面向对象,首先要了解js中的对象和原型,下面本文给大家介绍JavaScript中的对象和原型(一)知识,一起看下吧
    2016-08-08
  • JS制作适用于手机和电脑的通知信息效果

    JS制作适用于手机和电脑的通知信息效果

    这篇文章主要介绍了JS制作适用于手机和电脑的通知信息效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • webpack-dev-server 的 host 配置 0.0.0.0的方法

    webpack-dev-server 的 host 配置 0.0.0.0的方法

    这篇文章主要介绍了webpack-dev-server 的 host 配置 0.0.0.0的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,,需要的朋友可以参考下
    2024-01-01
  • javascript中的toFixed固定小数位数 简单实例分享

    javascript中的toFixed固定小数位数 简单实例分享

    这篇文章介绍了toFixed固定小数位数的简单例子,有需要的朋友可以参考一下
    2013-07-07

最新评论