电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

TypeScript接口和類型的區別小結

瀏覽:3日期:2022-06-09 13:51:18
目錄
  • 接口(interface)
  • 類型(type)
  • interface vs type
  • 結論

TypeScript 是由 Microsoft 開發的一種開源的編程語言。它是 JavaScript 的超集,添加了靜態類型和其他功能,使代碼更為健壯且易于維護。在 TypeScript 中,有兩種主要的定義自定義類型的方式:接口和類型。盡管它們在外觀上可能相似,但它們之間有一些關鍵的區別。在本文中,我們將討論 TypeScript 中接口和類型之間的區別并給出具體代碼示例。

接口(interface)

interface 是一種定義復雜類型的方式,它可以用來描述對象類型、函數類型、類類型、數組類型、字面量類型等。interface 通常用來描述一個對象的外部形狀(Shape),即這個對象有哪些屬性、屬性的類型是什么、方法的簽名是什么等。例如:

interface Person {
? name: string;
? age: number;
? sayHello(): void;
}
class Student implements Person {
? name: string;
? age: number;
? constructor(name: string, age: number) {
? ? this.name = name;
? ? this.age = age;
? }
? sayHello() {
? ? console.log(`Hi, my name is ${this.name}, and I"m ${this.age} years old.`);
? }
}
const student = new Student("Tom", 20);
student.sayHello(); // Hi, my name is Tom, and I"m 20 years old.

上面的代碼中,我們定義了一個 Person 接口,它包含 name 和 age 屬性以及 sayHello 方法。然后我們定義了一個 Student 類,它實現了 Person 接口,因此必須實現 name、age 和 sayHello。在 sayHello 方法中,我們使用模板字符串輸出學生的姓名和年齡。

類型(type)

type 是一種定義簡單類型的方式,它可以用來定義基本類型、聯合類型、交叉類型、字面量類型等。type 可以給一個類型起一個別名,以便重復使用。例如:

type Status = "active" | "inactive";
type Person = {
? name: string;
? age: number;
? status: Status;
};

上面的代碼定義了一個 Status 類型和一個 Person 類型。Status 類型是一個字符串字面量類型,它只能是 'active' 或 'inactive' 中的一個。Person 類型描述了一個人對象的形狀,包括 name 屬性、age 屬性和 status 屬性,其中 status 屬性的類型是 Status。

雖然 interface 和 type 在定義類型時有些不同,但在使用時它們是具有一定通用性的。例如,我們可以使用 interface 定義函數的參數類型和返回值類型,也可以使用 type 定義同樣的類型,例如:

interface Sum {
? (a: number, b: number): number;
}
type Multiply = (a: number, b: number) => number;

上面的代碼分別使用 interface 和 type 定義了一個加法函數類型 Sum 和一個乘法函數類型 Multiply,它們都接受兩個參數并返回它們的運算結果。

interface vs type

接口可以被繼承,而類型不能。

接口可以通過 extends 關鍵字來擴展基礎接口,例如:

interface Person {
? name: string;
? age: number;
}
interface Employee extends Person {
? company: string;
}
const employee: Employee = { name: "John", age: 30, company: "Acme Inc." };

類型不能被繼承。

類型只能定義一次,而接口可以定義多次并且會自動合并。

類型可以定義一次,例如:

type Status = "active" | "inactive";
const status: Status = "active";

如果試圖再次定義同名類型,則會報錯。
接口可以定義多次,并且會自動合并同名屬性,例如:

interface Person {
? name: string;
}
interface Person {
? age: number;
}
const person: Person = { name: "John", age: 30 };

接口可以定義可選屬性和只讀屬性,而類型不能。

接口可以定義可選屬性和只讀屬性,例如:

interface Person {
? name: string;
? age?: number;
? readonly email: string;
}
const person1: Person = { name: "John", email: "john@example.com" };
const person2: Person = { name: "Jane", age: 25, email: "jane@example.com" };
person1.email = "jane@example.com"; // Error: Cannot assign to "email" because it is a read-only property.

類型不能定義可選屬性和只讀屬性。

類型可以定義聯合類型和交叉類型,而接口不能。

類型可以用聯合類型和交叉類型來組合多個類型,例如:

type Person = { name: string } & { age: number };
type Status = "active" | "inactive";
type UserStatus = { status: Status } & Person;
const userStatus: UserStatus = { name: "John", age: 30, status: "active" };

接口可以定義索引簽名,而類型不能。

接口可以定義索引簽名,例如:

interface Dictionary {
? [key: string]: number;
}
const dict: Dictionary = { a: 1, b: 2 };

類型不能定義索引簽名。

結論

  • 在對象擴展情況下,interface 使用 extends 關鍵字,而 type 使用交叉類型(&)。
  • 同名的 interface 會自動合并,并且在合并時會要求兼容原接口的結構。
  • interface 與 type 都可以描述對象類型、函數類型、Class 類型,但 interface 無法像 type 那樣表達元組、一組聯合類型等等。
  • interface 無法使用映射類型等類型工具,也就意味著在類型編程場景中我們還是應該使用 type 。

interface 就是描述對象對外暴露的接口,其不應該具有過于復雜的類型邏輯,最多局限于泛型約束與索引類型這個層面。而 type alias 就是用于將一組類型的重命名,或是對類型進行復雜編程。

到此這篇關于TypeScript接口和類型的區別小結的文章就介紹到這了,更多相關TypeScript接口和類型區別內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: JavaScript
主站蜘蛛池模板: 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛婚外情取证-青岛王军侦探事务所 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 长城人品牌官网 | 电动葫芦-河北悍象起重机械有限公司| 样品瓶(色谱样品瓶)百科-浙江哈迈科技有限公司 | 衬氟旋塞阀-卡套旋塞阀-中升阀门首页| 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 无锡装修装潢公司,口碑好的装饰装修公司-无锡索美装饰设计工程有限公司 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 多功能三相相位伏安表-变压器短路阻抗测试仪-上海妙定电气 | 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 干培两用箱-细菌恒温培养箱-菲斯福仪器| 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 丹佛斯变频器-丹佛斯压力开关-变送器-广州市风华机电设备有限公司 | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 制氮设备_PSA制氮机_激光切割制氮机_氮气机生产厂家-苏州西斯气体设备有限公司 | RS系列电阻器,RK_RJ启动调整电阻器,RQ_RZ电阻器-上海永上电器有限公司 | 领先的大模型技术与应用公司-中关村科金 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 有机废气处理-rto焚烧炉-催化燃烧设备-VOC冷凝回收装置-三梯环境 | 数显水浴恒温振荡器-分液漏斗萃取振荡器-常州市凯航仪器有限公司 | 温控器生产厂家-提供温度开关/热保护器定制与批发-惠州市华恺威电子科技有限公司 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 自动气象站_气象站监测设备_全自动气象站设备_雨量监测站-山东风途物联网 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 山东锐智科电检测仪器有限公司_超声波测厚仪,涂层测厚仪,里氏硬度计,电火花检漏仪,地下管线探测仪 | 天津拓展_天津团建_天津趣味运动会_天津活动策划公司-天津华天拓展培训中心 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 电销卡_北京电销卡_包月电话卡-豪付网络| 净气型药品柜-试剂柜-无管道净气型通风柜-苏州毕恩思 | 螺杆真空泵_耐腐蚀螺杆真空泵_水环真空泵_真空机组_烟台真空泵-烟台斯凯威真空 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] |