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
英文地址,請注明出處:http://en.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;政府部門/事業單位…