停止使用 TypeScript 接口

2024-05-04 05:04

本文主要是介绍停止使用 TypeScript 接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么应该使用类型而不是接口

在这里插入图片描述

这张图片是由人工智能生成的。

类型和接口 是每个 TypeScript 程序中使用的重要特性。

然而,由于类型和接口在功能上非常相似,这就引出了一个问题:哪个更好?

今天,我们将评估类型和接口,然后得出结论,说明为什么在大多数情况下应该使用类型而不是接口。

所以,不多说了……让我们马上开始吧。


那么它们有什么区别呢?

让我们分析一下这个 Person 类型接口 的定义:

type Person = {name: stringage: number
}interface Person {name: stringage: number
}

很明显,类型和接口有相似的语法,关键区别在于类型使用 = 来定义对象的形状,而不是接口。

然而,事情远不止于此。

让我们深入挖掘一下,一起探索和评估类型和接口。

可扩展性

就可扩展性而言,许多人认为接口是显而易见的赢家,因为接口可以使用 extends 扩展其他接口。

// 可扩展性示例interface Job {job: string
}interface Person extends Job {name: stringage: number
}// 使用了 Person 和 Job 的属性。
const person: Person = {name: "John",age: 25,job: "全栈 Web 开发者",
}

在这里,Person 接口扩展了 Job,因此 Job 接口的属性合并到了 Person 中。


另一方面,类型也通过利用 联合 | 或 交集 & 运算符来合并现有类型,提供了可扩展性。

接口无法直接表达这种行为。

// ✅ 正常工作
type Person = {name: stringage: number
} & { job: string }// ❌ 不工作
interface Person {name: stringage: number
} & { job: string }

实现

在 TypeScript 中,接口与面向对象编程(OOP)兼容,就像其他语言(例如 Java 或 C#)一样。

这意味着接口可以在类中使用 implements 实现。

现在让我们将 Person 定义为一个类,并实现一个名为 Work 的新接口,满足它们之间的约定。

// 实现示例interface Work {doWork: () => void
}class Person implements Work {name: stringage: numberconstructor(name: string, age: number) {this.name = namethis.age = age}// 实现 doWork 方法以满足 `Work` 接口。doWork() {console.log("工作中...")}
}const person = new Person("John", 25)
person.doWork()

因此,如果你经常使用 OOP,接口将比类型更适用,因为类型不能直接由类实现。

性能

当谈论性能时,我们指的是 TypeScript 编译器执行的 “类型检查” 性能,随着代码库规模的增加,其性能会呈指数级下降。

这就是为什么我们要对类型和接口在类型检查性能方面进行基准测试,看看哪个更优。

这是一个视频,由 Matt Pocock 解释了类型和接口之间的区别,以及在类型检查性能方面实际上 没有 类型和接口之间的任何差异。

接口为什么会有害

在 TypeScript 中,接口具有一个称为 声明合并 的独特特性。

声明合并是指 TypeScript 编译器将 两个或多个 具有相同名称的接口合并为 一个

// 初始的 Person 接口
interface Person {name: stringage: number
}
// 使用 "声明合并" 来完善 Person 接口
interface Person {gender: string
}// 使用 "合并" 接口来定义一个新的 "person"
const person: Person = { name: "John", age: 25, gender: "男性" }

一方面,这个特性允许方便地对现有接口进行细化和扩展,而不会影响其他依赖项。

另一方面,声明合并可能会对你的代码库产生有害且令人惊讶的影响,主要有以下 两个 原因:

  1. 优先级顺序:后面的声明总是优先于前面的声明。如果不小心,当在程序的许多部分进行声明合并时,这可能导致意外问题。
  2. 与类的不安全合并:由于 TypeScript 编译器不检查属性的初始化,这可能导致意外的运行时错误。

类型没有这个问题,因此更直接且安全

结论

除非需要特定的接口行为,例如可扩展的细化或使用 OOP 进行实现,否则最好使用类型

类型灵活、直接,并且避免与声明合并相关的问题。

与接口相比,类型在性能上也完全相同,为提供了另一个选择类型而不是接口的理由。

这篇关于停止使用 TypeScript 接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958382

相关文章

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一