成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

interface和type有什么區別嗎?你知道嗎?

開發 前端
在typescript里,還有很多容易搞混淆的概念,interface和type是最典型的,目的都是實現對象的類型和結構定義,但是又有些許不同。對于使用的建議,在庫或第三方類型定義中的公共API定義,應使用interface來提供聲明合并功能。

1.寫在前面

當我們使用 TypeScript時,就會用到 interface和type去描述對象的形狀和結構,平時感覺他們用法好像是一樣的,有區別又好像沒有的感覺。這兩個概念對于多數人而言還是有點容易混淆,那么這篇文章帶領你去看看他們的異同。

2.interface和type

interface用于描述對象的形狀和結構,可以給數據增加類型,而且方便進行復用。而type是通過別名進行重新定義類型的,類型別名指的是為類型創建新名稱,需要注意的是,我們并沒有定義一個新類型。兩者是對接口定義的兩種不同形式,目的都是在于定義對象的形狀和結構。

但是,兩者還是有些許差別:

  • interface和type都能夠被擴展,interface可以拓展type,但是type不能繼承interface
  • 類可以以相同的方式實現(implements)接口或類型別名,但類不能實現使用類型別名定義的聯合類型。
  • type 可以使用聯合類型和交集,interface 不能使用聯合類型和交集組合
  • 類型別名聲明可用于任何基元類型、聯合或交集。在這方面,interface被限制為對象類型和函數簽名。
  • interface可以實現聲明合并,type不能實現聲明合并

使用interface和type描述對象的形狀和結構

interface ISum {
(num1: number, num2: number):number
}
const sum: ISum = (num1,num2)=>{
return num1+num2
}


type TSum = (num1: number, num2: number)=>number
const sum2: TSum = (num1,num2)=>{
return num1+num2
}

如果有聯合類型,就使用type

interface IUser{
name:string
age:number
}

interface IStudent{
university: string
}

// Error: 不能使用interface進行聯合類型,不存在interface IPerson = IUser | IStudent;
type TPerson = IUser | IStudent;

type 可以使用聯合類型和交集,interface 不能使用聯合類型和交集組合

type TPersonA = {
name: string
}
type TPersonB = {
age: number
}
// 交集
type PartialPerson = TPersonA & TPersonB;
// 并集 聯合類型
type PartialPerson = TPersonA | TPersonB;

interface的特性

對于接口上沒有定義的屬性,可以使用以下方法進行聲明:

(1)使用類型斷言

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

const pingping: IPerson = {
name:"pingping",
age:18,
address:"北京"
} as IPerson

(2)可以使用繼承

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

interface IUser extends IPerson{
address:string
}

const pingping: IUser = {
name:"pingping",
age:18,
address:"北京"
}

(3)可以使用可選類型

interface IPerson{
name:string;
age:number;
address?: string;
}

const pingping: IPerson = {
name:"pingping",
age:18,
address:"北京"
}

(4)可使用可索引接口

interface IPerson{
name:string;
age:number;
[key: string]: any;
}
const pingping: IPerson = {
name:"pingping",
age:18,
address:"北京"
}

interface和type都能夠被擴展,interface可以拓展type,但是type不能繼承interface,type可以使用&聯合類型來實現類似的功能

interface IPerson{
name:string
age:number
}

type TPerson = {
name:string
age:number
}

interface IStudent extends IPerson{
university:string
}
interface IStudent extends TPerson{
university:string
}

type TStudent = TPerson & {
university:string
}

type TStudent = IPerson & {
university:string
}

類可以以相同的方式實現(implements)接口或類型別名,但類不能實現使用類型別名定義的聯合類型

interface IPerson {
name:string
age:number
}

class User implements IPerson {
name = "pingping";
age = 18;
}

type TPerson = {
name:string
age:number
};

class User implements TPerson {
name = "pingping";
age = 18;
}

type PartialPerson = { name: string } | { age: number };

// A class can only implement an object type or
// intersection of object types with statically known members.
class SomePartialPerson implements PartialPerson { // Error
name = "pingping";
age = 18;
}

interface可以實現聲明合并,type不能實現聲明合并

interface IPerson{
name: string
}
interface IPerson{
age: number
}
const user: IPerson = {
name: "pingping",
age: 18
}

類型別名聲明可用于任何基元類型、聯合或交集。在這方面,interface被限制為對象類型和函數簽名

type TPerson = [name: string, age: number];

我們沒有辦法使用接口聲明元組。不過,我們可以在接口內部使用元組

interface IPerson{
user: [name: string, age: number]
}

3. 參考文章

  • 《使用 TypeScript 常見困惑:interface 和 type 的區別是什么?》
  • 《一份不可多得的 TS 學習指南(1.8W字)》
  • 《type和interface的區別知多少?》

4. 寫在最后

在typescript里,還有很多容易搞混淆的概念,interface和type是最典型的,目的都是實現對象的類型和結構定義,但是又有些許不同。對于使用的建議,在庫或第三方類型定義中的公共API定義,應使用interface來提供聲明合并功能。除此之外,隨你如何使用,但是在整個代碼庫中應該盡量要保持一致性。

責任編輯:武曉燕 來源: 前端萬有引力
相關推薦

2024-05-27 00:00:00

localhostIPv6IPv4

2022-06-08 07:34:25

InnoDBdeleteMySQL

2021-02-06 21:57:40

Debug模式Release

2021-07-27 08:02:45

DTO 軟件Pojo

2022-08-26 01:41:42

GPUCPU架構

2022-09-02 09:02:44

TypeInterface

2022-08-02 10:01:34

Import語句ES模塊

2024-01-01 08:25:53

ViewSurface框架

2024-03-26 00:10:08

預測AI泛化

2023-04-26 10:21:04

2024-10-22 09:59:36

虛擬化容器化系統

2018-10-26 10:41:06

ApacheNginx服務器

2023-12-20 08:23:53

NIO組件非阻塞

2024-04-30 09:02:48

2023-12-07 07:08:09

Angular函數

2023-06-01 08:15:04

CentOS紅帽

2023-09-01 07:38:45

ArrayListArrayst實線類

2025-02-18 08:11:17

2022-11-28 00:04:17

2024-01-15 12:16:37

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频一区二区三区 | 成人激情视频免费观看 | 久久精品一区二区 | 精品久久久久久久久久 | 国产精品毛片无码 | 日日碰碰| 色婷婷精品国产一区二区三区 | 夜夜爽99久久国产综合精品女不卡 | 午夜视频在线免费观看 | 男人天堂色 | 一区二区三区视频 | 国产免费又色又爽又黄在线观看 | 在线看片国产 | 天天操人人干 | 国产色在线 | 成人精品一区 | 成人性视频免费网站 | 中文字幕视频在线观看 | 羞羞的视频在线观看 | 国产一区二区三区在线看 | 琪琪午夜伦伦电影福利片 | 不卡av电影在线播放 | 欧美国产在线一区 | 久久久青草婷婷精品综合日韩 | 精品中文视频 | 日韩欧美一区二区三区免费观看 | 成人激情视频 | 91精品久久久久久久 | 在线看无码的免费网站 | 国产成人av在线播放 | 久久高清国产视频 | 精品久久久久久亚洲综合网站 | 日本公妇乱淫xxxⅹ 国产在线不卡 | 久久精品国产亚洲夜色av网站 | 午夜爽爽爽男女免费观看影院 | 欧美色性| 久产久精国产品 | 羞羞视频免费观 | 亚洲国产小视频 | 99久久久无码国产精品 | 一区二区三区在线播放 |