最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TypeScript中type與interface的使用和區(qū)別

 更新時間:2026年01月15日 10:15:28   作者:新節(jié)  
本文主要介紹了TypeScript中type與interface的使用和區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、基本概念對比

1. 基本語法

interface 示例

interface User {
  id: number;
  name: string;
}

interface Admin extends User {
  privileges: string[];
}

type 示例

type User = {
  id: number;
  name: string;
};

type Admin = User & {
  privileges: string[];
};

2. 核心相同點

? 都能描述對象形狀
? 都支持擴展(interface 用 extends,type 用交叉類型)
? 都支持實現(xiàn)(implements)
? 現(xiàn)代 TypeScript 中性能差異可以忽略

二、關鍵差異詳解

1. 擴展方式不同

interface 使用繼承:

interface Animal {
  name: string;
}

interface Bear extends Animal {
  honey: boolean;
}

type 使用交叉類型:

type Animal = {
  name: string;
};

type Bear = Animal & {
  honey: boolean;
};

2. 聲明合并(Interface 獨有)

interface User {
  name: string;
}

interface User {
  age: number;
}

// 最終 User 包含 name 和 age 屬性
const user: User = {
  name: "Alice",
  age: 30
};

type 不允許重復聲明,會報錯

3. 類型表達能力

type 能表達更復雜的類型

  • 聯(lián)合類型:

    type ID = number | string;
    
  • 元組類型:

    type Point = [number, number];
    
  • 映射類型:

    type Readonly<T> = {
      readonly [P in keyof T]: T[P];
    };
    
  • 條件類型:

    type IsString<T> = T extends string ? true : false;
    

4. 類實現(xiàn)(implement)

兩者都可以被類實現(xiàn),但語法不同:

// 使用 interface
interface ClockInterface {
  currentTime: Date;
}

class Clock implements ClockInterface {
  currentTime: Date = new Date();
}

// 使用 type
type ClockType = {
  currentTime: Date;
};

class DigitalClock implements ClockType {
  currentTime: Date = new Date();
}

三、使用場景推薦

優(yōu)先使用 interface 的情況

  1. 定義對象形狀(尤其是公共 API)

    // 更好的做法
    interface Config {
      apiUrl: string;
      timeout: number;
    }
    
  2. 需要聲明合并時

    // 擴展第三方庫類型
    declare module "vue" {
      interface ComponentCustomProperties {
        $filters: Filters;
      }
    }
    
  3. 面向對象編程(類實現(xiàn)接口)

    interface Serializable {
      serialize(): string;
    }
    
    class Document implements Serializable {
      serialize() {
        return "...";
      }
    }
    

優(yōu)先使用 type 的情況

  1. 需要聯(lián)合類型時

    type Result = Success | Failure;
    
  2. 需要元組類型時

    type Coordinates = [number, number];
    
  3. 需要復雜類型運算時

    type Partial<T> = {
      [P in keyof T]?: T[P];
    };
    
  4. 需要類型別名簡化時

    type StringOrNumber = string | number;
    

四、性能與編譯差異

方面interfacetype
聲明合并支持不支持
錯誤信息更友好相對復雜
編譯速度稍快(簡單場景)復雜類型可能稍慢
類型檢查早期綁定延遲解析

五、最佳實踐建議

  1. 項目一致性:團隊統(tǒng)一選擇一種風格(或制定明確規(guī)則)

  2. 公共 API:優(yōu)先使用 interface(更好的錯誤提示和擴展性)

  3. 復雜類型:使用 type 表達高級類型關系

  4. React Props & State

    // 推薦用法
    type Props = {
      visible: boolean;
    };
    
    type State = {
      count: number;
    };
    
    class Component extends React.Component<Props, State> {}
    

六、經(jīng)典案例對比

1. 擴展第三方庫類型

interface 方式(推薦)

declare namespace Express {
  interface Request {
    user?: User;
  }
}

type 方式(不可行)

// 無法這樣擴展第三方類型
type Express.Request = {
  user?: User;
};

2. 組件 Props 類型

type 方式(推薦)

type ModalProps = {
  visible: boolean;
  onClose: () => void;
  children?: React.ReactNode;
} & (
  | {
      type: "alert";
      message: string;
    }
  | {
      type: "confirm";
      question: string;
    }
);

到此這篇關于TypeScript中type與interface的使用和區(qū)別的文章就介紹到這了,更多相關TypeScript type與interface區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • js實現(xiàn)DOM走馬燈特效的方法

    js實現(xiàn)DOM走馬燈特效的方法

    這篇文章主要介紹了js實現(xiàn)DOM走馬燈特效的方法,以實例形式較為詳細的分析了走馬燈效果的實現(xiàn)原理與具體步驟,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • 認識Knockout及如何使用Knockout綁定上下文

    認識Knockout及如何使用Knockout綁定上下文

    Knockout簡稱ko,是一個輕量級的javascript類庫,采用MVVM設計模式(即Model、view、viewModel),簡單優(yōu)雅的實現(xiàn)了雙向綁定,實時更新,幫助您使用干凈的數(shù)據(jù)模型來創(chuàng)建豐富的、響應式的用戶界面
    2015-12-12
  • JavaScript實現(xiàn)的SHA-1加密算法完整實例

    JavaScript實現(xiàn)的SHA-1加密算法完整實例

    這篇文章主要介紹了JavaScript實現(xiàn)的SHA-1加密算法,以完整實例形式分析了SHA-1加密算法的具體實現(xiàn)技巧,需要的朋友可以參考下
    2016-02-02
  • 使用JS location實現(xiàn)搜索框歷史記錄功能

    使用JS location實現(xiàn)搜索框歷史記錄功能

    這篇文章主要介紹了使用JS location實現(xiàn)搜索框歷史記錄功能,本文通過實例 代碼講解的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • js封裝tab標簽頁實例分享

    js封裝tab標簽頁實例分享

    本篇文章主要分享了js封裝tab標簽頁的示例代碼,具有很好的參考價值,需要的朋友一起來看下吧
    2016-12-12
  • yepnope.js使用詳解及示例分享

    yepnope.js使用詳解及示例分享

    yepnope.js 是一個超高速的按條件異步加載資源的加載器,允許你只加載使用到的資源(css及js)。
    2014-06-06
  • webpack DefinePlugin源碼入口解析

    webpack DefinePlugin源碼入口解析

    這篇文章主要為大家介紹了webpack DefinePlugin源碼入口解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • JS數(shù)組的賦值介紹

    JS數(shù)組的賦值介紹

    本篇文章主要是對JS數(shù)組的賦值進行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-03-03
  • xml 與javascript結合的問題解決方法

    xml 與javascript結合的問題解決方法

    xml 與javascript結合的問題解決方法...
    2007-03-03
  • JavaScript中實現(xiàn)最高效的數(shù)組亂序方法

    JavaScript中實現(xiàn)最高效的數(shù)組亂序方法

    這篇文章主要介紹了JavaScript中實現(xiàn)最高效的數(shù)組亂序方法,數(shù)組亂序的意思是,把數(shù)組內的所有元素排列順序打亂,需要的朋友可以參考下
    2014-10-10

最新評論

交城县| 龙泉市| 台前县| 普兰店市| 浮梁县| 中西区| 开封县| 新晃| 宜昌市| 大姚县| 汾西县| SHOW| 许昌市| 禹城市| 都匀市| 聂拉木县| 那坡县| 河池市| 依兰县| 乌拉特中旗| 天镇县| 侯马市| 昭觉县| 全州县| 宣恩县| 渑池县| 彝良县| 北海市| 广东省| 大冶市| 洪泽县| 资中县| 兰溪市| 嘉荫县| 蒙阴县| 岚皋县| 三门峡市| 泽普县| 色达县| 元谋县| 专栏|