当前位置: 首页 > article >正文

type和interface的区别

一、语法形式

  • type语法
    使用type关键字来定义,可以定义基本类型别名、联合类型、交叉类型以及函数类型等多种复杂类型。例如:
    • 定义基本类型别名这里MyString就是string类型的一个别名,后续变量声明时可以用它来指定类型。
    • 定义联合类型表示MyUnionType这个类型可以是string或者number类型的值,变量value遵循这个联合类型定义来赋值。
    • 定义交叉类型交叉类型是将多个类型合并在一起,这里IntersectType要求同时具备{ name: string }{ age: number }的属性结构。
    • 定义函数类型

      定义了一个接收string类型参数且无返回值的函数类型,变量myFunc按照此函数类型进行赋值。

  • interface语法
    通过interface关键字来定义,主要用于定义对象类型结构,更侧重于描述对象具有哪些属性以及属性对应的类型,还可以定义可选属性、只读属性以及函数类型的属性等。例如:
    • 定义对象类型结构清晰地定义了名为Person的对象类型,包含nameage两个必选属性,变量person的赋值要符合这个对象类型要求。
    • 定义可选属性

      使用?符号可以定义可选属性,像这里的password就是可选的,所以在给变量user赋值时可以只提供username这个属性。

    • 定义只读属性通过readonly关键字定义只读属性,赋值后就不能再对其进行修改了。
    • 定义函数类型的属性可以在接口中定义函数类型的属性,规定对象中相应函数的参数和返回值类型。

二、重复定义处理方式

  • type重复定义
    在同一个作用域内,不允许使用相同的名称重复定义type。例如:

    会直接报错,因为type一旦定义了某个名称的类型后,就不能再用相同名称去定义其他类型了。

  • interface重复定义
    同一个作用域内可以对interface进行重复定义,并且后续的定义会自动与之前的定义进行合并。例如:先定义了Animal接口包含name属性,后面再次定义Animal接口添加了age属性,最终Animal接口就相当于包含了nameage两个属性,这种特性在对一些复杂接口进行扩展时非常有用。

三、实现(implements)与继承(extends)方面

  • type相关情况
    type本身不能直接用于类的继承或者实现相关操作,它主要就是定义类型别名、组合复杂类型等,更多是从类型层面去描述数据结构和函数签名等情况。例如,不能像下面这样使用type进行类的继承:
  • interface相关情况
    • 实现(implements):类可以实现接口,意味着类必须要实现接口中定义的所有属性和方法(函数类型属性),确保类的实例符合接口所规定的类型结构。例如:

      Car类实现了Vehicle接口,所以必须要提供startstop这两个无返回值的函数方法来满足接口要求。

    • 继承(extends):接口之间可以相互继承,通过继承可以扩展已有接口的定义内容,复用之前接口定义的属性等信息。例如:Mammal接口继承了Animal接口,所以Mammal类型的对象既要满足Animal接口中eat方法的要求,又要具备自身定义的run方法。

四、适用场景

  • type适用场景

    • 复杂类型组合场景:当需要定义联合类型、交叉类型等复杂的类型组合时,type更加方便灵活,比如定义一个可以是字符串、数字或者布尔值的联合类型,或者将多个对象类型通过交叉类型的方式合并起来等情况,使用type能清晰准确地表达这种复杂类型结构。
    • 类型别名需求场景:如果只是想给某个已有的类型(如stringnumber等基本类型或者一些复杂的自定义类型)取一个更简洁易懂的别名,便于后续代码中使用和类型管理,那么type是很好的选择,例如定义一个UserId类型别名来代表number类型的用户 ID,使代码的类型语义更加明确。
  • interface适用场景

    • 定义对象结构场景:在大多数情况下,当需要定义对象的结构,明确对象有哪些属性、属性的类型以及是否可选、只读等情况时,interface是更符合直觉的选择,尤其是在面向对象编程风格较为明显的代码中,用于规范类实例或者普通对象的类型组成。
    • 接口扩展与复用场景:如果有多个相关的接口,需要通过继承来扩展功能或者复用已有的接口定义内容,比如在设计一个软件系统中不同层级的模块接口,通过接口继承可以很好地梳理接口之间的层次关系,便于代码的维护和扩展,此时interface就发挥了重要作用。

总体而言,typeinterface在语法、功能特点及适用场景等方面都存在差异,开发者可以根据具体的项目需求和代码设计情况来灵活选择使用它们。


http://www.kler.cn/a/407086.html

相关文章:

  • 用python将一个扫描pdf文件改成二值图片组成的pdf文件
  • 小程序24-滚动效果:scroll-view组件详解
  • Linux无sudo权限将zsh作为默认shell
  • Docker 容器的初始化设置
  • vue中路由缓存
  • async在js中是强制同步的意思吗
  • 蓝队基础,网络七杀伤链详解
  • [C语言]第十三节 指针一基础知识到高级技巧的全景探索
  • BERT的中文问答系统39
  • 4644 DCDC电源芯片在相控阵雷达的应用(完整版)
  • Metasploit模块具体有哪些?
  • Dubbo集成SpringBoot实现远程服务调用
  • Flink Transformation - 转换算子全面解析
  • YOLOv11融合针对去雾场景的DEA-Net中的细节增强注意力模块及相关改进思路
  • [C/C++][FFmpeg] 关于avcodec_send_frame(encoder_ctx, NULL) 的解释
  • 力扣-Hot100-图论【算法学习day.38】
  • 基于Java Springboot高校教务管理系统
  • 【编程题目】列表、元组及集合
  • 【话题】Bug 故事:跨时区的时间转换错误
  • python运动统计 2024年9月python二级真题 青少年编程电子学会编程等级考试python二级真题解析
  • MySQL监控工具与性能分析方法:深入剖析与实践
  • MATLAB中Simulink的基础知识
  • 湖北某高校联合开源网安打造协同育人新范式,推动智能网联汽车行业可持续发展
  • _FYAW智能显示控制仪表的简单使用_串口通信
  • Java中的类加载器
  • 【Linux课程学习】:命令行参数,环境变量