精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

type 與 interface 的區(qū)別,你真的懂了嗎?

開發(fā) 前端
在寫 ts 相關(guān)代碼的過程中,總能看到 interface 和 type 的身影。它們的作用好像都一樣的,相同的功能用哪一個都可以實現(xiàn),也都很好用,所以也很少去真正的理解它們之間到底有啥區(qū)別, 分別在什么場景下使用,將自己學習的內(nèi)容記錄分享一下。

類型別名 type

首先認識一下什么是類型別名?

類型別名用來給一個類型起個新名字,使用 type 創(chuàng)建類型別名,類型別名不僅可以用來表示基本類型,還可以用來表示對象類型、聯(lián)合類型、元組和交集。讓我們看一些例子:

type userName = string; // 基本類型
type userId = string | number; // 聯(lián)合類型
type arr = number[];
// 對象類型
type Person = {
id: userId; // 可以使用定義類型
name: userName;
age: number;
gender: string;
isWebDev: boolean;
};
// 范型
type Tree<T> = { value: T };
const user: Person = {
id: "901",
name: "椿",
age: 22,
gender: "女",
isWebDev: false,
};
const numbers: arr = [1, 8, 9];

接口 interface

接口是命名數(shù)據(jù)結(jié)構(gòu)(例如對象)的另一種方式;與type 不同,interface僅限于描述對象類型。

接口的聲明語法也不同于類型別名的聲明語法。讓我們將上面的類型別名 Person 重寫為接口聲明:

interface Person {
id: userId;
name: userName;
age: number;
gender: string;
isWebDev: boolean;
}

interface和type的相似之處

在討論二者區(qū)別之前, 首先看一下二者的相似之處(為何開發(fā)中,我們覺得用哪個都一樣)

都可以描述 Object和Function

兩者都可以用來描述對象或函數(shù),但語法不同:

Type

type Point = {
x: number;
y: number;
};
type SetPoint = (x: number, y: number) => void;

Interface

interface Point {
x: number;
y: number;
}
interface SetPoint {
(x: number, y: number): void;
}

二者都可以被繼承

interface 和 type 都可以繼承。

另一個值得注意的是,接口和類型別名并不互斥。類型別名可以繼承接口,反之亦然。只是在實現(xiàn)形式上,稍微有些差別。

interface 繼承 interface

interface Person{
name:string
}
interface Student extends Person { stuNo: number }

interface 繼承 type

type Person{
name:string
}
interface Student extends Person { stuNo: number }

type 繼承 type

type Person{
name:string
}
type Student = Person & { stuNo: number }

type 繼承 interface

interface Person{
name:string
}
type Student = Person & { stuNo: number }

實現(xiàn) implements

類可以實現(xiàn)interface 以及 type(除聯(lián)合類型外)

interface ICat{
setName(name:string): void;
}
class Cat implements ICat{
setName(name:string):void{
// todo
}
}
// type
type ICat = {
setName(name:string): void;
}
class Cat implements ICat{
setName(name:string):void{
// todo
}
}

上面提到了特殊情況,類無法實現(xiàn)聯(lián)合類型, 是什么意思呢?

type Person = { name: string; } | { setName(name:string): void };
// 無法對聯(lián)合類型Person進行實現(xiàn)
// error: A class can only implement an object type or intersection of object types with statically known members.
class Student implements Person {
name= "張三";
setName(name:string):void{
// todo
}
}

上面聊了interface與 type的相似之處, 接下來就來看看他們的區(qū)別。

二者區(qū)別

1. 定義基本類型別名

type可以定義基本類型別名, 但是interface無法定義,如:

type userName = string
type stuNo = number
...

2. 聲明聯(lián)合類型

type可以聲明聯(lián)合類型, 例如:

type Student = {stuNo: number} | {classId: number}

3. 聲明元組

type可以聲明 元組類型:

type Data = [number, string];

以上都是 type能做到, 而interface做不到的, 接下來聊聊type做不到的

4. 聲明合并

如果你多次聲明一個同名的接口,TypeScript 會將它們合并到一個聲明中,并將它們視為一個接口。這稱為聲明合并, 例如:

interface Person { name: string }
interface Person { age: number }
let user: Person = {
name: "Tolu",
age: 0,
};

這種情況下,如果是type的話,重復使用Person是會報錯的:

type Person { name: string };  
// Error: 標識符“Person”重復。ts(2300)
type Person { age: number }

5. 索引簽名問題

如果你經(jīng)常使用TypeScript, 一定遇到過相似的錯誤:

Type 'xxx' is not assignable to type 'yyy'

Index signature is missing in type 'xxx'.

看個例子來理解問題:

interface propType{
[key: string] : string
}
let props: propType
type dataType = {
title: string
}
interface dataType1 {
title: string
}
const data: dataType = {title: "訂單頁面"}
const data1: dataType1 = {title: "訂單頁面"}
props = data
// Error:類型“dataType1”不可分配給類型“propType”; 類型“dataType1”中缺少索引簽名
props = data1

我們發(fā)現(xiàn)dataType和dataType1對應的類型一樣,但是interface定義的就賦值失敗,是什么原因呢?剛開始百思不解,最后我在 stack overflow上找到了一個相似的問題:

并且很幸運的找到了有效的答案:

翻譯過來的大致意思就是:

Record<string,string>與{[key:string]:string}相同。只有當該類型的所有屬性都已知并且可以對照該索引簽名進行檢查時,才允許將子集分配給該索引簽名類型。在您的例子中,從exampleType到Record<string,string>的所有內(nèi)容都是可分配的。這只能針對對象字面量類型進行檢查,因為一旦聲明了對象字面量類型,就無法更改它們。因此,索引簽名是已知的。

相反,在你使用interface去聲明變量時,它們在那一刻類型并不是最終的類型。由于interfac可以進行聲明合并,所以總有可能將新成員添加到同一個interface定義的類型上。

再結(jié)合??第4點 聲明合并的講解, 這樣就很好理解了。就是說interface定義的類型是不確定的, 后面再來一個:

interface propType{
title:number
}

這樣propType類型就被改變了。

總結(jié)

官方推薦用 interface,其他無法滿足需求的情況下用 type。

但其實,因為 聯(lián)合類型 和 交叉類型 是很常用的,所以避免不了大量使用 type 的場景,一些復雜類型也需要通過組裝后形成類型別名來使用。

所以,如果想保持代碼統(tǒng)一,還是可選擇使用 type。通過上面的對比,類型別名 其實可涵蓋 interface 的大部分場景。

對于 React 組件中 props及 state,使用 type ,這樣能夠保證使用組件的地方不能隨意在上面添加屬性。如果有自定義需求,可通過 HOC二次封裝。

編寫三方庫時使用interface,其更加靈活自動的類型合并可應對未知的復雜使用場景。

參考資料:

  • TypeScript: type alias 與 interface
責任編輯:龐桂玉 來源: 前端大全
相關(guān)推薦

2022-05-06 09:21:21

TypeScriptinterfacetype

2013-12-26 09:44:30

互聯(lián)網(wǎng)物聯(lián)網(wǎng)區(qū)別

2023-10-27 07:39:44

IOC容器Spring

2022-07-27 08:01:29

CMS垃圾回收器

2022-03-08 15:01:48

負載均衡IP服務器

2021-10-10 20:36:49

Android Root權(quán)限

2024-03-05 18:19:07

localhostLinux數(shù)據(jù)庫

2021-10-12 10:50:31

鴻蒙HarmonyOS應用

2024-12-04 09:41:06

2024-04-07 08:23:01

JS隔離JavaScript

2011-06-14 12:56:55

SQL Server復災

2021-08-05 08:32:45

TypeScript InterfaceType

2013-07-15 16:55:45

2022-03-13 18:53:31

interfacetypeTypeScript

2024-08-12 15:23:43

LangChain

2022-06-07 08:14:35

PGPAGETUPLE

2022-11-28 07:10:57

2025-10-13 07:46:25

JARSpringMaven

2022-06-06 07:58:52

勒索軟件惡意軟件解密

2022-01-06 07:59:32

WebGPUOpenGL引擎
點贊
收藏

51CTO技術(shù)棧公眾號

极品少妇一区二区三区| 国产白丝在线观看| 久久成人久久爱| 米奇精品一区二区三区在线观看| 好吊操视频这里只有精品| 日本不卡1234视频| 国产精品国产三级国产三级人妇 | 97欧美成人| 一区二区三区四区蜜桃| 欧美极品一区二区| 国产又色又爽又黄又免费| 亚洲午夜极品| www.亚洲一区| 久久久亚洲av波多野结衣| 国产精品国产三级在线观看| 欧美日韩国产区| 日本三日本三级少妇三级66| 午夜视频免费在线| 韩国av一区二区| 国产a∨精品一区二区三区不卡| 亚洲天堂一级片| 国产91一区| 亚洲精品国产成人| 性生活一级大片| 91精品美女| 黑人巨大精品欧美一区二区三区| 精品一区二区三区毛片| 国产裸舞福利在线视频合集| 成人午夜伦理影院| 亚洲综合自拍一区| 一区二区小视频| 老司机精品久久| 8050国产精品久久久久久| 美国黄色小视频| 欧美色图在线播放| 国产亚洲精品一区二区| 日本护士做爰视频| 福利在线一区| 欧美mv日韩mv国产网站app| gogogo高清免费观看在线视频| 成人影院大全| 国产h视频在线观看| 国产69精品久久99不卡| 成人h视频在线观看播放| 日韩免费av网站| 国产一区二区你懂的| 九色精品美女在线| 日本黄色小说视频| 亚洲色图国产| 久久久999精品| 亚洲人做受高潮| 亚洲电影影音先锋| 久久成人一区二区| 天天做夜夜爱爱爱| 亚洲澳门在线| 欧美成人精品在线视频| 极品久久久久久| 97欧美在线视频| 久久精品国产亚洲精品2020| 亚洲视频重口味| 综合久久综合| 久久久久女教师免费一区| 欧美日韩精品亚洲精品| 欧美午夜不卡影院在线观看完整版免费| 久久亚洲精品视频| 欧美黄片一区二区三区| 在线观看视频日韩| 国产91精品不卡视频| 中文字幕第四页| 亚洲制服av| 国产精品一区二区久久久| 亚洲天堂免费av| 国产精品一卡二卡在线观看| 国产精品夜夜夜一区二区三区尤| 少妇精品视频一区二区 | 少妇久久久久久久久久| 国产一区二区三区四区五区 | 欧美xxxx黑人又粗又长| 亚洲第一综合色| 97视频在线免费播放| 外国电影一区二区| 日韩欧美一区二区久久婷婷| 国产精品成人无码专区| 国产精品亚洲二区| 久久精品国产久精国产思思| 日本系列第一页| 丝袜诱惑制服诱惑色一区在线观看 | 视频一区在线免费看| 色国产精品一区在线观看| 日日躁夜夜躁aaaabbbb| 日本在线一区二区三区| 亚洲成人网在线| 久久婷婷五月综合| 欧美a级片一区| 日本免费一区二区三区视频观看| 影音先锋国产资源| 成人毛片视频在线观看| 日本一区二区在线视频| h片在线观看网站| 狠狠爱在线视频一区| 69久久久久久| 极品一区美女高清| 色婷婷综合久久久久| 日本三级片在线观看| 青草av.久久免费一区| 国产精品久久久久久久天堂第1集| 裸体xxxx视频在线| 一区二区三区高清在线| 日本va中文字幕| eeuss国产一区二区三区四区| 亚洲天堂成人在线| 精品无码人妻一区二区三区品| 日本特黄久久久高潮| 国产欧美日本在线| 韩国av网站在线| 欧美性受xxxx| 亚洲av片不卡无码久久| 一本一道久久综合狠狠老| 国产成人综合精品| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 国产精品久久久久久一区二区三区| 国产3p露脸普通话对白| 国产精品igao视频网网址不卡日韩| 日韩成人在线电影网| 欧美久久久久久久久久久久| 日日骚欧美日韩| 成人免费在线一区二区三区| 香蕉视频免费在线播放| 日本道色综合久久| 国产乱了高清露脸对白| 欧美激情在线| 91精品视频网站| 五月香视频在线观看| 色爱区综合激月婷婷| 久久福利小视频| 一区在线免费观看| 99蜜桃在线观看免费视频网站| 日本中文在线观看| 欧美调教femdomvk| 青娱乐国产视频| 久久在线精品| 欧美日韩一区二区三区在线观看免| www.youjizz.com在线| 日韩一区二区三区av| 熟女av一区二区| 久久精品二区亚洲w码| 日韩精品大片| 国产另类xxxxhd高清| 亚洲欧洲日产国产网站| 国语对白永久免费| 久久久久国产精品麻豆| 久久久噜噜噜www成人网| 丝袜连裤袜欧美激情日韩| 午夜欧美大片免费观看| 欧美性猛交 xxxx| 五月天视频一区| 亚洲av无码一区二区三区网址| 亚洲免费成人| 久久久水蜜桃| 国产在线|日韩| 色阁综合伊人av| 99国产揄拍国产精品| 亚洲乱码国产乱码精品精98午夜| 青青草精品在线| 最新亚洲激情| 日本公妇乱淫免费视频一区三区| 欧美精品总汇| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 久久久精品蜜桃| 日本新janpanese乱熟| 欧美影院三区| 亚洲一区二区三区久久| 欧美aaa免费| 精品视频久久久久久久| 天天干,天天干| 国产精品久久久久久亚洲毛片| 三年中文在线观看免费大全中国| 欧美日韩福利| 麻豆视频成人| 亚洲伊人精品酒店| 欧美高跟鞋交xxxxxhd| 午夜视频福利在线观看| 精品视频色一区| 在线免费日韩av| 91蜜桃传媒精品久久久一区二区| 无码人妻丰满熟妇区毛片| 日韩精品第一区| 国产激情美女久久久久久吹潮| 亚洲日本天堂| 久久伊人91精品综合网站| 欧美视频一二区| 欧美探花视频资源| 免看一级a毛片一片成人不卡| 97超碰欧美中文字幕| 男女视频在线看| 激情91久久| 一级做a爰片久久| 嫩草国产精品入口| 国产精品自在线| 两个人看的在线视频www| 中文字幕av一区中文字幕天堂| 亚洲av无码乱码国产精品久久 | 欧美精品入口| 成人a在线观看| 麻豆免费版在线观看| 最近的2019中文字幕免费一页| 免费看日韩av| 8x8x8国产精品| 51国产偷自视频区视频| 综合欧美一区二区三区| 免费成人深夜夜行p站| 麻豆传媒免费在线观看| 亚洲精品一区二区三区蜜桃下载| 免费视频网站在线观看入口| 一二三四社区欧美黄| 精品人妻中文无码av在线| 成人免费看的视频| 亚洲美女性囗交| 久久久久国产精品一区二区| 国产一区二区三区在线免费| 日韩专区精品| 日本一区二区高清视频| 加勒比色老久久爱综合网| 亚洲aa在线观看| 亚洲高清国产拍精品26u| 日本国产高清不卡| 97天天综合网| 久久99国产综合精品女同| 色视频在线免费观看| 亚洲人成77777在线观看网| 色窝窝无码一区二区三区成人网站 | 玩弄中年熟妇正在播放| 国产精品毛片久久| 日韩精品一区二区三区外面 | 一本久道久久综合狠狠爱亚洲精品| 日韩美女精品| 精品一区二区三区自拍图片区 | 日干夜干天天干| 一区二区三区欧美日| 亚洲精品久久久久久国| 国产精品国产三级国产aⅴ中文| 性欧美一区二区| 国产拍揄自揄精品视频麻豆| 亚洲女优在线观看| 日本一区二区在线不卡| 亚洲成人黄色av| 国产调教视频一区| a天堂中文字幕| 亚洲国产高清在线| 91视频免费看片| 日韩一区中文字幕| 日韩激情小视频| 亚洲精品免费一二三区| 欧美精品一区二区成人| 亚洲高清免费视频| 日韩成人一区二区三区| 精品国产精品三级精品av网址| 偷偷操不一样的久久| 欧美性xxxx极品hd满灌| 人人妻人人爽人人澡人人精品| 色av成人天堂桃色av| 国产精品第六页| 欧美日韩国产综合久久| 国产三级第一页| 亚洲第一网中文字幕| 亚洲三级中文字幕| 亚洲天堂第一页| 在线中文资源天堂| 久久天天躁狠狠躁老女人| 污片在线免费观看| 国内偷自视频区视频综合 | 国产精品自在线| 亚洲精品一区国产| 久久精品中文字幕一区二区三区| 国产一区二区三区网| 亚洲欧美国产精品桃花| 欧美+日本+国产+在线a∨观看| 男人插女人视频在线观看| 亚洲欧美日韩国产一区| 羞羞的视频在线| 波波电影院一区二区三区| 亚洲成人黄色av| 一区二区三区在线观看欧美| 亚洲高清毛片一区二区| 欧美日韩国产片| 视频二区在线观看| 上原亚衣av一区二区三区| 三级网站视频在在线播放| 欧美在线性视频| 国产精品一级在线观看| 久久久久欧美| 欧美黄色大片网站| 成人黄色片视频| 国产精一区二区三区| 女人被狂躁c到高潮| 最新不卡av在线| 亚洲高清毛片一区二区| 91精品国产色综合久久久蜜香臀| 天堂成人在线视频| 日韩午夜在线视频| 密臀av在线播放| 91精品视频在线免费观看| 欧美a级网站| 日韩video| 青青草精品视频| 日韩av一二区| 亚洲一卡二卡三卡四卡无卡久久 | 亚洲 国产 欧美一区| 欧美色图首页| 国产aⅴ爽av久久久久| 91看片淫黄大片一级| 老女人性淫交视频| 欧美熟乱第一页| 日本午夜在线视频| 欧美福利视频在线| www 久久久| 亚洲va久久久噜噜噜久久狠狠 | 久久久久国产精品嫩草影院| 欧美猛交免费看| 久久伊人国产| 日本成人三级电影网站| 国产欧美大片| 欧美xxxxx少妇| 亚洲色图欧洲色图婷婷| 国产99久久久久久免费看| 亚洲国产精品成人一区二区| 最新超碰在线| 91九色国产社区在线观看| 成人激情诱惑| 91热这里只有精品| 久久综合色综合88| 国产精品久久久免费视频| 日韩欧美一级二级三级久久久 | 欧美在线视频免费播放| 永久免费精品视频| 中国老女人av| 国产一区二区在线影院| 国产日产精品一区二区三区的介绍| 欧美在线免费播放| 精品视频二区| 日韩av大片免费看| 女人av一区| 日韩福利视频在线| 国产欧美日韩亚州综合| 91视频在线视频| 国产一区二区三区高清在线观看| 在线看片福利| 日本成人三级电影网站| 视频一区国产视频| 欧美激情 一区| 精品视频免费在线| 精品麻豆一区二区三区| 91精品中国老女人| 午夜电影亚洲| 亚洲精品激情视频| 天天色综合天天| 深夜福利在线观看直播| 青青在线视频一区二区三区 | 中文字幕免费高| 国产一区二区电影| 国产在线观看免费视频今夜| 亚洲成人精品在线| 国产日韩电影| 一区不卡字幕| 成人一道本在线| 伦av综合一区| 色系列之999| 亚洲精品在线播放| 免费看一级大黄情大片| 国产日产欧美一区| 国产剧情精品在线| 久久久久久一区二区三区| 亚洲区小说区图片区qvod按摩| 激情综合网俺也去| 国产精品色婷婷| www.国产免费| 奇米成人av国产一区二区三区| 全球成人免费直播| 巨乳女教师的诱惑| 欧美日韩亚洲系列| 1区2区3区在线观看| 91久久精品www人人做人人爽| 亚洲黄色av| 国产在视频线精品视频| 日韩欧美在线综合网| 在线天堂中文资源最新版| 亚洲精品无人区| 成人精品国产福利| 香蕉污视频在线观看| 久久国产精品偷| 国产精品一国产精品| 激情图片中文字幕| 色婷婷综合久久久| 羞羞视频在线免费国产| 欧美一区观看| 国产成人福利片| 中文字幕+乱码+中文字幕明步| 久久69精品久久久久久久电影好 | www.中文字幕在线| 中文字幕亚洲欧美在线不卡|