type(类型别名)和 interface的区别和最佳实践

核心结论

在大多数情况下,它们可以互换使用,都能描述对象的结构。它们的区别更多在于设计和扩展能力上。


主要区别总结表

特性interface (接口)type (类型别名)
扩展方式使用 extends 继承
interface A extends B {}
使用 & 交叉类型
type A = B & C
合并声明支持:同名接口会自动合并不支持:同名类型会报错
描述能力主要描述对象形状功能更强,可描述任意类型(联合、元组、原始类型等)
实现 (implements)可以被类实现
class C implements A {}
可以被类实现(描述对象时)
class C implements A {}
性能轻微优势:在错误信息和性能上,早期有细微差别,现在可忽略不计
可读性更偏向于 OOP(面向对象编程)风格,表示一个“契约”更偏向于 FP(函数式编程)风格,像一个类型表达式

详细解释与示例

1. 扩展 (Extending)
  • interface 使用继承,更符合传统 OOP 思维。

    interface Animal {name: string;
    }interface Bear extends Animal {honey: boolean;
    }
  • type 使用交叉类型 (&),更像是逻辑运算。

    type Animal = {name: string;
    }type Bear = Animal & {honey: boolean;
    }
2. 声明合并 (Declaration Merging)

这是两者最关键的区别。

  • interface支持合并。如果你定义了两个同名的接口,TypeScript 会将它们合并为一个。

    interface User {name: string;
    }interface User {age: number;
    }// 最终 User 接口为:{ name: string; age: number; }
    const user: User = { name: 'John', age: 30 }; // 正确

    这个特性非常有用,尤其是在为第三方库或全局对象(如 Window)添加自定义属性时。

  • type不支持合并。重复声明同名的类型别名会报错。

    type User = {name: string;
    }type User = { // Error: Duplicate identifier 'User'age: number;
    }
3. 描述能力 (Descriptive Capabilities)
  • interface:基本上只能用于定义对象的类型结构。

    interface Point {x: number;y: number;
    }
  • type:功能更强大,可以定义任何类型

    // 联合类型 (Union)
    type ID = string | number;// 元组类型 (Tuple)
    type PointTuple = [number, number];// 原始类型别名
    type Name = string;// 从其他类型映射 (Mapped Types)
    type Nullable<T> = { [P in keyof T]: T[P] | null };

最佳实践与如何选择

虽然很多时候可以互换,但社区形成了一些共识:

  1. 优先使用 interface

    • 当你需要定义对象的形状并希望使用声明合并时(例如,库的类型定义、扩展全局对象)。

    • 在面向对象风格的代码中,定义类和它们之间的契约。

  2. 使用 type 的情况

    • 当你需要定义联合类型元组映射类型时。

    • 当你需要重命名定义复杂类型表达式时。

    • 当你需要一个函数的类型时(通常用 type)。

      type ClickHandler = (event: MouseEvent) => void;
  3. 保持一致性

    • 在一个项目中,最好对同一种用途保持统一。例如,全部用 interface 定义对象,或者全部用 type。混用会增加项目的认知负担。

总结

场景推荐
定义对象形状(尤其是需要被实现的)interface (或 type)
需要声明合并(如扩展库类型)必须用 interface
定义联合类型、元组必须用 type
定义函数类型通常用 type
简单重命名原始类型通常用 type

一句话总结:interface 更适合定义对象契约和实现 OOP 的继承,而 type 更强大灵活,适合定义各种复杂的类型关系。 对于大多数应用开发,遵循 优先使用 interface 定义对象,在 interface 能力不足时使用 type 是一个很好的策略。

一句话核心区别

interface 是官方合同范本,type 是万能自定义模板

详细对比(方便记忆)

1. 扩展方式不同

  • interface 用 extends(继承)→ 像儿子继承爸爸

  • type 用 &(交叉)→ 像把两张纸粘在一起

2. 重复定义时

  • interface → 会自动合并(像在合同上追加条款)

  • type → 会报错(像不允许有两个同名的模板)

3. 能定义的内容

  • interface → 主要定义对象形状

  • type → 什么都能定义(对象、联合类型、元组等)

4. 使用场景

  • 需要被类实现时 → 优先用 interface

  • 需要定义复杂类型时 → 只能用 type

记忆口诀

接口能合并,类型更万能
对象用接口,复杂用类型
扩展用继承,交叉类型连
类要实现时,接口是首选

简单选择指南

  • 大部分情况下定义对象 → 用 interface

  • 需要合并声明时 → 必须用 interface

  • 需要定义联合类型、元组等 → 必须用 type

记住这个比喻:interface 是标准合同,type 是自定义模板,就能很好区分了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921785.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode中使用git、githup的基操

一、git提交 配置账户密码 查看用户信息 git config --global user.name # 查看用户名 git config --global user.email # 查看邮箱账户配置 # 设置全局用户名和邮箱 git config --global user.name "你的用户名" git config --global user.email "你的邮箱&q…

jsBridge接入流程

import deviceInfo from ./deviceInfo import { setRefreshToken } from ./token// 设备判断 const u navigator.userAgent export const isAndroid u.indexOf(Android) > -1 || u.indexOf(Adr) > -1 export const isIOS !!u.match(/\(i[^;];( U;)? CPU.Mac OS X/)…

【C++】19. 封装红⿊树实现set和map

文章目录一、源码及框架分析二、模拟实现map和set1、insert的实现2、iterator的实现3、map⽀持[ ]4、模拟实现的完整源代码1&#xff09;RBTree.h2&#xff09;Myset.h3&#xff09;Mymap.h4&#xff09;Test.cpp一、源码及框架分析 SGI-STL30版本源代码&#xff0c;map和set的…

面试不会问题

1. 什么是表锁&#xff1f;什么是行锁&#xff1f;什么情况下会使用表锁&#xff1f;InnoDB引擎通过“索引”实现行锁&#xff08;锁定满足条件的行&#xff09;&#xff0c;但如果操作无法通过索引定位行&#xff0c;会导致行锁失效&#xff0c;进而升级为表锁。常见的表现为&…

达梦数据库-用户,权限,角色

达梦数据库-用户,权限,角色 在达梦数据库(DM8)中,用户(User)、权限(Privilege)和角色(Role) 是数据库安全体系的核心组成部分,用于控制谁可以访问数据库、能访问哪些对象以及能执行哪些操作。 下面为你提供一份全面、详细、结构化的说明,帮助你深入理解达梦数据…

uniapp原生插件 TCP Socket 使用文档

uniapp原生插件 TCP Socket 使用文档 试了插件市场几个TCP Socket插件都不能实现监听服务器主动断开&#xff0c;于是闲来无事就开发了一款&#xff0c;本插件是一个基于 Netty 实现的 TCP 通信模块&#xff0c;用于在 UniApp 插件中提供 TCP 连接、数据发送和连接管理功能。以…

VM中CentOS 7密码重置

重启虚拟机点击e进入内核处理向下划找到UTF-8在后面输入rd.breakctrl X进入单用户模式mount -o remount,rw/sysroot进行挂盘 chroot /sysroot访问系统&#xff0c;并使用passwd修改root密码 出现乱码 输入LANGen touch /.autorelabel 保存配置 exit exit退出等待系统重新打开&…

车规级MOS管AEC-Q101认证的关键参数解读与失效模式-深圳阿赛姆

摘要本文拆解AEC-Q101认证的7大关键测试项&#xff08;UIS/温度循环/THB等&#xff09;&#xff0c;结合M120N06JC等型号实测数据&#xff0c;解析雪崩失效/栅氧击穿/绑定线脱落等故障机理&#xff0c;附选型核查表一、AEC-Q101认证核心测试项与参数解读1.1 非钳位电感开关测试…

嵌入式铁头山羊stm32-ADC实现软件触发的常规序列的单通道转换-Day25

目录 一、实验目的 二、电路连接 三、实验执行&#xff08;五步&#xff09; 1.初始化ADC的IO引脚 2.配置ADC的时钟&#xff0c;注意要小于14MHz 3.根据ADC的编程接口 实现初始化ADC的基本参数 4.配置常规序列并闭合触发输入开关 5.闭合总开关、启动并读取转换结果 四…

多模态模型出现“幻觉”,描述了表格中不存在的内容,如何修正?

在日常工作中&#xff0c;多模态模型的 “幻觉” 问题已成为影响效率的关键痛点 —— 当我们需要模型基于文档生成建议性内容&#xff08;如行业报告分析、论文数据解读等&#xff09;时&#xff0c;模型常因无法准确理解文档信息&#xff0c;输出包含 “虚构内容” 的结果&…

Java AI 智能问数:Function调用版如何重塑企业数据决策

Java AI 智能问数&#xff1a;Function调用版如何重塑企业数据决策 在数字化转型浪潮中&#xff0c;企业一把手常面临数据查询的痛点&#xff1a;分析师需编写复杂SQL&#xff0c;业务人员依赖IT支持&#xff0c;决策链条冗长。传统方法效率低下&#xff0c;而自然语言处理&…

AI-调查研究-74-具身智能 机器人学习新突破:元学习与仿真到现实迁移的挑战与机遇

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布&#xff01;“快的…

劳务员的就业前景如何?

劳务员的就业前景整体较为乐观&#xff0c;受到行业需求、政策支持等因素的积极影响&#xff0c;同时也面临着一些挑战。以下是具体分析&#xff1a;1.就业优势行业需求稳定&#xff1a;建筑行业作为国民经济的支柱产业&#xff0c;持续发展使得对劳务员的需求较为稳定。无论是…

libvirt 新手指南:从零开始掌握虚拟化管理

引言 在云计算、大数据和边缘计算的时代&#xff0c;虚拟化技术已成为 IT 基础设施的核心支柱。它允许我们在单一物理服务器上运行多个虚拟机&#xff08;Virtual Machine&#xff0c;简称 VM&#xff09;&#xff0c;从而实现资源的高效利用、快速部署和灵活扩展。对于新手来说…

OpenLayers数据源集成 -- 章节三:矢量要素图层详解

前言在前面的文章中&#xff0c;我们学习了OpenLayers的瓦片图层&#xff08;TileLayer&#xff09;技术。本文将深入探讨OpenLayers中的矢量要素图层&#xff08;VectorFeatureLayer&#xff09;功能&#xff0c;这是WebGIS开发中处理矢量数据、实现交互式地图的核心技术。矢量…

从“能说话”到“会做事”:AI Agent如何重构日常工作流?

从“能说话”到“会做事”&#xff1a;AI Agent如何重构日常工作流&#xff1f;在人工智能飞速发展的当下&#xff0c;AI已从最初简单的语音交互、信息检索进化到了具备自主决策与行动能力的新阶段&#xff0c;其中AI Agent的出现堪称关键转折点。从只能机械“说话”回答问题&a…

随身wifi到底有没有用?

不用绕弯子&#xff0c;直接说清随身WiFi怎么回事&#xff0c;对比完家用WiFi和手机热点&#xff0c;再避坑&#xff5e;一、先明白&#xff1a;随身WiFi到底是啥&#xff1f; 1、简单讲就是「能揣兜里的WiFi发射器」——要么插张物联卡&#xff0c;要么内置流量&#xff0c;能…

MySQL问题8

MySQL深度分页优化思路 常见的3种优化思路如下&#xff1a; 1. 子查询优化方式 示例改写前&#xff1a; SELECT * FROM words WHERE name oee ORDER BY id LIMIT 99999990, 10;这个写法会导致 MySQL 扫描并丢弃前面 99999990 行&#xff0c;效率极低。 示例改写后&#xff…

洛谷 P1249 最大乘积-普及/提高-

P1249 最大乘积 题目描述 一个正整数一般可以分为几个互不相同的自然数的和&#xff0c;如 312312312&#xff0c;413413413&#xff0c;514235142351423&#xff0c;615246152461524。 现在你的任务是将指定的正整数 nnn 分解成若干个互不相同的自然数&#xff08;也可以不分解…

大学地理信息科学该如何学习才能好就业

一、明确专业特点与就业方向地理信息科学是一门交叉性强、实践性强的学科&#xff0c;融合了地理学、计算机科学、测绘、遥感等多个领域&#xff0c;广泛应用于自然资源管理、城市规划、交通、环境、农业、水利、智慧城市等行业。主要就业方向包括&#xff1a;政府部门/事业单位…