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

解讀Typescript中interface和type的用法及區(qū)別

 更新時間:2025年02月05日 09:01:12   作者:¢C-TiAmo  
在TypeScript中,`interface`和`type`都可以用來定義自定義類型,但它們在語法、聲明合并、可擴展性、兼容性、類型注解和類型別名、訪問修飾符、聯(lián)合類型與交叉類型、實現接口和類型別名、映射類型、泛型參數位置、擴展對象類型以及調用簽名和構造函數等方面存在一些差異

Typescript中interface和type區(qū)別

在typeScript中,“interface”和“type”都是用來定義自定義類型的關鍵字,他們在以下差異,用法上的一些區(qū)別(歡迎大家繼續(xù)補充……)

1. 語法差異

  • 'interface’使用關鍵字’interface’定義,例如:interface Person { name: string; }
  • 'type’使用關鍵字’type’定義,例如:type Person = { name: string; }

2.聲明合并(Merging)的能力

  • 'interface’具有聲明合并的能力,允許多個同名的接口進行合并,通過這樣的方式可以擴展接口的成員定義。
  • 'type’不具備聲明合并的能力,多次定義同一個類型會報錯

3.可擴展性

  • 'interface’可以使用關鍵字’extends’繼承另一個接口,實現接口的復用和擴展。
  • 'type’可以使用交叉類型(Intersection Types)進行復用和擴展,但不能使用extends關鍵字繼承。

4.兼容性

  • 'interface’在進行類型兼容性檢查時,會進行"兼容性遞歸檢查",只要目標類型滿足源類型的成員要求,就認為類型兼容。
  • 'type’沒有進行"兼容性遞歸檢查",只有精確匹配才被認為是兼容。

5.類型注解和類型別名

  • 'interface’可以用于定義函數類型、類類型等復雜類型的注解。
  • 'type’可以用于定義任意類型的別名,可以簡化復雜類型的書寫。

6.訪問修飾符

  • 'interface’可以在屬性和方法上使用公共(public),私有(private)和受保護(protected)等訪問修飾符。
  • 'type’不能指定訪問修飾符,它假定所有成員都是公共的。

7.聯(lián)合類型與交叉類型

  • 'type’可以使用聯(lián)合類型(Union Types)和交叉類型(Intersection Types)來組合多個類型。
  • 'interface’沒有直接支持聯(lián)合類型和交叉類型的語法,但可以通過繼承和聲明合并的方式實現類似的效果。

8.實現接口和類型別名

  • 'interface’可以被類實現(implements)來強制約束類的結構。
  • 'type’不能直接被類實現,它更適合作為類型別名來簡化復雜類型的定義。

9.映射類型

  • 'type’可以使用映射類型來根據已有類型生成新的類型。
  • 'interface’不支持映射類型。
type Options<T> = {
  [K in keyof T]: boolean;
};

interface PersonOptions {
  name: boolean;
  age: boolean;
}

// 使用映射類型
type Result = Options<PersonOptions>;
// Result 的類型為 { name: boolean, age: boolean }

// 不能使用映射類型
// interface ResultInterface extends Options<PersonOptions> {}

10.范型參數位置

  • 在范型參數位置上,'type’可以出現在任意位置,且可以交叉和聯(lián)合多個類型。
  • 在范型參數位置上,'interface’只能出現在類型別名的右側。
type Tuple = [number, string];

type NumberArray = Array<number>;

type Union = number | string;

// 有效的定義
type MyType<T> = { value: T };
type MyType2 = MyType<number>;

// 有效的定義
interface MyInterface<T> {
  value: T;
}
type MyInterface2 = MyInterface<number>;

// 無效的定義
// interface MyInterface<T> {
//   value: T;
// }
// interface MyInterface2 extends MyInterface<number> {}

11.擴展對象類型

  • 'interface’可以通過聲明合并的方式擴展已有的對象類型,從而添加新的屬性或方法。
  • 'type’需要使用交叉類型來實現對象類型的擴展。
interface Person {
  name: string;
}

interface ExtendedPerson extends Person {
  age: number;
}

// 使用聲明合并進行擴展
const person: ExtendedPerson = {
  name: 'John',
  age: 25,
};

type Person = {
  name: string;
};

type ExtendedPerson = Person & {
  age: number;
};

// 使用交叉類型進行擴展
const person: ExtendedPerson = {
  name: 'John',
  age: 25,
};

12.調用簽名和構造函數

  • 'interface’可以定義調用簽名來描述函數類型,也可以定義構造函數簽名來描述類的構造函數。
  • 'type’可以使用函數類型和構造函數類型別名來描述函數類型和類的構造函數。
interface Greeting {
  (name: string): string;
}

interface Person {
  new (name: string): Person;
  name: string;
  sayHello(): void;
}

// 定義調用簽名和構造函數簽名
const greeting: Greeting = (name) => `Hello, ${name}!`;

class PersonClass implements Person {
  constructor(public name: string) {}
  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

type Greeting = (name: string) => string;

type Person = {
  new (name: string): Person;
  name: string;
  sayHello(): void;
};

// 使用類型別名
const greeting: Greeting = (name) => `Hello, ${name}!`;

class PersonClass implements Person {
  constructor(public name: string) {}
  sayHello() {
    console.log(`Hello, my name is ${this.name}.`);
  }
}

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 使用Electron將Web應用打包成桌面軟件

    使用Electron將Web應用打包成桌面軟件

    本文為前端開發(fā)者提供了一站式指南,學習如何使用Electron將Web應用打包成桌面軟件,涵蓋主進程與渲染進程概念、BrowserWindow配置、安全模型及Fastify服務器嵌入等,通過實例詳細解析Electron核心概念及安全配置,幫助開發(fā)者快速掌握Electron開發(fā)技巧
    2026-05-05
  • 基于JS實現翻書效果的頁面切換樣式

    基于JS實現翻書效果的頁面切換樣式

    在項目開發(fā)中經常遇到翻書的頁面切換效果,基于js代碼怎么實現的呢?今天小編給大家分享基于JS實現翻書效果的頁面切換樣式,需要的朋友參考下吧
    2017-02-02
  • js正則表達式匹配數字字母下劃線等

    js正則表達式匹配數字字母下劃線等

    本文給大家分享的是使用正則表達式檢測只含有漢字、數字、字母、下劃線等示例,非常的簡單實用,這里推薦給大家,有需要的小伙伴參考下。
    2015-04-04
  • Bpmn.js activiti 流程編輯器詳細教程

    Bpmn.js activiti 流程編輯器詳細教程

    流程編輯器是一種用于創(chuàng)建、編輯和管理流程圖的工具,它提供了一個可視化的界面,使用戶能夠以圖形化的方式定義和配置流程的各個步驟、條件和流程間的關系,說明關于bpmn.js的一些事件, 通過本文你可以了解到,感興趣的朋友一起看看吧
    2023-10-10
  • javascript 簡單抽屜效果的實現代碼

    javascript 簡單抽屜效果的實現代碼

    javascript 簡單抽屜效果的實現代碼,需要的朋友可以參考下,大家自行測試。
    2010-03-03
  • JavaScript中數組的22種方法必學(推薦)

    JavaScript中數組的22種方法必學(推薦)

    這篇文章主要介紹了JavaScript中數組的22種方法必學(推薦)的相關資料,需要的朋友可以參考下
    2016-07-07
  • JavaScript中的對象和原型(一)

    JavaScript中的對象和原型(一)

    大家都知道在js中沒有類的概念,因此它的對象也與基于類的語言中的對象有所不同。所以大家要了解面向對象,首先要了解js中的對象和原型,下面本文給大家介紹JavaScript中的對象和原型(一)知識,一起看下吧
    2016-08-08
  • JS制作適用于手機和電腦的通知信息效果

    JS制作適用于手機和電腦的通知信息效果

    這篇文章主要介紹了JS制作適用于手機和電腦的通知信息效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • webpack-dev-server 的 host 配置 0.0.0.0的方法

    webpack-dev-server 的 host 配置 0.0.0.0的方法

    這篇文章主要介紹了webpack-dev-server 的 host 配置 0.0.0.0的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,,需要的朋友可以參考下
    2024-01-01
  • javascript中的toFixed固定小數位數 簡單實例分享

    javascript中的toFixed固定小數位數 簡單實例分享

    這篇文章介紹了toFixed固定小數位數的簡單例子,有需要的朋友可以參考一下
    2013-07-07

最新評論

大悟县| 阿拉善盟| 义马市| 南华县| 留坝县| 弋阳县| 乳山市| 乌恰县| 岱山县| 武宣县| 朝阳区| 龙岩市| 泌阳县| 辉县市| 长宁县| 嘉祥县| 麟游县| 大名县| 宽甸| 三穗县| 沙坪坝区| 夏邑县| 常宁市| 奈曼旗| 余江县| 区。| 谢通门县| 洱源县| 宜兴市| 大竹县| 新疆| 扶风县| 招远市| 海宁市| 仲巴县| 眉山市| 灵寿县| 镇巴县| 延庆县| 新巴尔虎右旗| 陵水|