AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

TypeScript 中的類型與接口

來源: 責編: 時間:2024-05-16 09:10:36 131觀看
導讀在 TypeScript 中,定義類型有兩種方式:“類型”和“接口”。人們經常想知道該使用哪一種,答案并非適用于所有情況。有時一種更好,但在許多情況下,兩者可以互換使用。我們來詳細了解一下類型和接口的不同點和相似點。類型和

在 TypeScript 中,定義類型有兩種方式:“類型”和“接口”。33i28資訊網——每日最新資訊28at.com

人們經常想知道該使用哪一種,答案并非適用于所有情況。有時一種更好,但在許多情況下,兩者可以互換使用。33i28資訊網——每日最新資訊28at.com

我們來詳細了解一下類型和接口的不同點和相似點。33i28資訊網——每日最新資訊28at.com

類型和類型別名

在 TypeScript 中,我們有一種叫做“類型”的東西,它幫助我們描述我們正在處理的數據類型。這就像為我們的信息提供一個藍圖。33i28資訊網——每日最新資訊28at.com

基本類型包括字符串、布爾值、數字、數組、元組和枚舉。33i28資訊網——每日最新資訊28at.com

但是,還有更多!我們還有“類型別名”。可以把它們想象成類型的昵稱。我們不是在創建新類型;我們只是給它們起了更友好的名稱。這使我們的代碼更容易閱讀和理解。33i28資訊網——每日最新資訊28at.com

例如,我們可以為數字創建一個叫做“我的數字”的類型別名,所以我們可以不用寫“數字”,只需要說“我的數字”。33i28資訊網——每日最新資訊28at.com

我們還可以為用戶數據創建一個類型別名,描述一個用戶的數據應該是什么樣子。33i28資訊網——每日最新資訊28at.com

當人們討論“類型與接口”時,他們實際上是在討論“類型別名與接口”。這就像給同一組事物起了不同的名稱。33i28資訊網——每日最新資訊28at.com

TypeScript 中的接口

在 TypeScript 中,可以將接口視為一個對象必須遵循的規則或要求集合。這就像一份合約,說:“嘿,如果你想成為‘客戶’,你必須有‘名稱’和‘地址’。”33i28資訊網——每日最新資訊28at.com

現在,還有另一種表達這些規則的方法。你可以使用所謂的“類型注解”。這有點像說,“這里是‘客戶’應該長什么樣子”,然后列出‘名稱’和‘地址’屬性及其類型,就像你在接口中所做的那樣。33i28資訊網——每日最新資訊28at.com

所以,無論你使用接口還是類型注解,你本質上都在定義同樣的期望集合,對于‘客戶’應該是什么樣子。這就像給同一組指令起了兩個不同的名字。33i28資訊網——每日最新資訊28at.com

類型和接口的區別

類型和接口用于定義自定義數據結構和形狀,但它們在行為和使用上有一些差異。33i28資訊網——每日最新資訊28at.com

原始類型

使用類型:33i28資訊網——每日最新資訊28at.com

type MyNumber = number;

在這種情況下,我們創建了一個類型別名 MyNumber,它是 number 原始類型的別名。33i28資訊網——每日最新資訊28at.com

使用接口:33i28資訊網——每日最新資訊28at.com

你不能使用接口直接定義像 number 這樣的原始類型。它們在 TypeScript 中是預定義的。33i28資訊網——每日最新資訊28at.com

聯合類型

使用類型:33i28資訊網——每日最新資訊28at.com

type MyUnionType = number | string;

在這里,我們定義了一個類型 MyUnionType,它可以包含 number 或 string 的值。33i28資訊網——每日最新資訊28at.com

使用接口:33i28資訊網——每日最新資訊28at.com

接口通常不用于直接表示聯合類型。你應該使用類型別名來表示這種用途。33i28資訊網——每日最新資訊28at.com

函數類型

使用類型:33i28資訊網——每日最新資訊28at.com

type MyFunctionType = (arg1: number, arg2: string) => boolean;

這定義了一個類型 MyFunctionType,用于一個函數,該函數接受兩個參數,一個數字和一個字符串,并返回一個布爾值。33i28資訊網——每日最新資訊28at.com

使用接口:33i28資訊網——每日最新資訊28at.com

interface MyFunctionInterface {  (arg1: number, arg2: string): boolean;}

這個接口 MyFunctionInterface 表示相同的函數類型。33i28資訊網——每日最新資訊28at.com

聲明合并

使用接口:33i28資訊網——每日最新資訊28at.com

interface Person {  name: string;}interface Person {  age: number;}

TypeScript 將自動將這兩個 Person 接口合并為一個,包含 name 和 age 的屬性。33i28資訊網——每日最新資訊28at.com

使用類型:33i28資訊網——每日最新資訊28at.com

類型別名不支持聲明合并。如果你多次定義相同的類型別名,將導致錯誤。33i28資訊網——每日最新資訊28at.com

擴展 vs. 交叉

使用擴展:33i28資訊網——每日最新資訊28at.com

interface A { propA: number; }interface B extends A { propB: string; }

接口 B 擴展了接口 A,繼承了 propA 屬性并添加了新的屬性 propB。33i28資訊網——每日最新資訊28at.com

使用交叉:33i28資訊網——每日最新資訊28at.com

type AB = A & { propB: string; }

在這里,我們使用交叉來組合 A 的屬性和新屬性 propB,以創建類型 AB。33i28資訊網——每日最新資訊28at.com

擴展時處理沖突

TypeScript 要求擴展時具有相同名稱的屬性的類型匹配:33i28資訊網——每日最新資訊28at.com

interface A { commonProp: number; }interface B { commonProp: string; }interface AB extends A, B { }// 錯誤: A 和 B 中的 'commonProp' 屬性必須具有相同的類型

typescript要解決沖突,你需要確保類型匹配或使用函數的方法重載。33i28資訊網——每日最新資訊28at.com

處理元組類型

使用類型:33i28資訊網——每日最新資訊28at.com

type MyTupleType = [number, string];const tuple: MyTupleType = [42, "hello"];

在這里,我們使用 type 定義了一個元組類型,然后我們可以創建該元組類型的變量。33i28資訊網——每日最新資訊28at.com

使用接口:33i28資訊網——每日最新資訊28at.com

interface MyTupleInterface {  0: number;  1: string;}const tuple: MyTupleInterface = [42, "hello"];

你也可以使用接口定義元組類型,使用方式保持不變。33i28資訊網——每日最新資訊28at.com

何時使用類型 vs. 接口

當你需要組合或修改現有結構時,使用接口。如果你在處理庫或創建新的庫,接口是你的首選。33i28資訊網——每日最新資訊28at.com

它們允許你合并或擴展聲明,使得與現有代碼一起工作更加容易。當你以面向對象編程的方式思考時,接口也更易讀。33i28資訊網——每日最新資訊28at.com

當你需要更強大的功能時,選擇類型。TypeScript 的類型系統提供了諸如條件類型、泛型、類型保護等高級工具。33i28資訊網——每日最新資訊28at.com

這些功能為你提供了更多控制你的類型的方式,幫助你創建健壯、強類型的應用程序。接口無法提供這些能力。33i28資訊網——每日最新資訊28at.com

你通常可以根據個人喜好使用類型或接口。然而,在以下情況下使用類型別名:33i28資訊網——每日最新資訊28at.com

  • ? 當你想為基本數據類型(如‘字符串’或‘數字’)創建一個新名稱時。
  • ? 當定義更復雜的類型如聯合、元組或函數時。
  • ? 當重載函數時。
  • ? 當使用高級功能如映射類型、條件類型或類型保護時。

類型通常更靈活和表達性強。它們提供了一系列接口無法匹敵的高級功能,而 TypeScript 持續擴展其能力。33i28資訊網——每日最新資訊28at.com

我們使用類型別名自動生成一個對象類型的 getter 方法,這是你無法通過接口做到的:33i28資訊網——每日最新資訊28at.com

type Client = {    name: string;    address: string;}type Getters<T> = {    [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];};type clientType = Getters<Client>;// 結果是: // {//     getName: () => string;//     getAddress: () => string;// }

通過使用映射類型、模板文字和‘keyof’操作符,我們創建了一個類型,它可以為任何對象類型自動生成 getter 方法。33i28資訊網——每日最新資訊28at.com

此外,許多開發者更喜歡使用類型,因為它們與函數式編程范式很契合。33i28資訊網——每日最新資訊28at.com

TypeScript 中類型表達式的豐富性使得在保持類型安全的同時,更容易與函數式概念如組合和不變性一起工作。33i28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-88396-0.htmlTypeScript 中的類型與接口

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 聊聊主流的Kafka監控框架

下一篇: React 全新編譯器太好用了!

標簽:
  • 熱門焦點
Top