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

TypeScript 中 interface 和 type 的區別,你真的懂了嗎?

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

類型別名 type

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

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

type userName = string; // 基本類型
type userId = string | number; // 聯合類型
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

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

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

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

interface和type的相似之處

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

都可以描述 Object和Function

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

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 都可以繼承。

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

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 }

實現 implements

類可以實現interface 以及 type(除聯合類型外)

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
}
}

上面提到了特殊情況,類無法實現聯合類型, 是什么意思呢?

type Person = { name: string; } | { setName(name:string): void };
// 無法對聯合類型Person進行實現
// 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的相似之處, 接下來就來看看他們的區別。

二者區別

1. 定義基本類型別名

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

type userName = string
type stuNo = number
...

2. 聲明聯合類型

type可以聲明聯合類型, 例如:

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. 索引簽名問題

如果你經常使用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

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

image.png

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

image.png

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

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

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

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

interface propType{
title:number
}

這樣propType類型就被改變了。

總結

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

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

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

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

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

責任編輯:龐桂玉 來源: 前端開發
相關推薦

2022-04-07 08:20:22

typeinterface前端

2022-09-02 09:02:44

TypeInterface

2013-12-26 09:44:30

互聯網物聯網區別

2022-03-08 15:01:48

負載均衡IP服務器

2022-07-27 08:01:29

CMS垃圾回收器

2021-06-23 08:01:18

TypeScript interface type

2021-08-05 08:32:45

TypeScript InterfaceType

2022-04-07 16:03:36

JavaScriptTypeScript

2024-03-05 18:19:07

localhostLinux數據庫

2020-09-23 09:08:05

typescript

2024-08-12 15:23:43

LangChain

2023-10-27 07:39:44

IOC容器Spring

2022-03-13 18:53:31

interfacetypeTypeScript

2022-05-15 21:52:04

typeTypeScriptinterface

2018-10-20 16:05:12

iOSAPP開發

2021-10-10 20:36:49

Android Root權限

2021-10-12 10:50:31

鴻蒙HarmonyOS應用

2013-07-15 16:55:45

2011-06-14 12:56:55

SQL Server復災

2024-04-07 08:23:01

JS隔離JavaScript
點贊
收藏

51CTO技術棧公眾號

久久久成人精品视频| 黑人巨大精品欧美一区二区一视频| 国产精品久在线观看| 992在线观看| 日韩欧洲国产| 天天影视网天天综合色在线播放| 欧美精品欧美精品系列c| 日韩中文字幕高清| 欧美在线高清| 精品视频在线播放色网色视频| 欧美一级黄色影院| av在线导航| av在线不卡电影| 国产精自产拍久久久久久| 国产探花在线播放| 国产不卡一区| 日韩欧美国产麻豆| 国产福利视频在线播放| 国产理论在线观看| 久久综合九色欧美综合狠狠| 成人国产在线视频| 天天干在线播放| 欧美日韩网站| 色综合影院在线| www.超碰97| 香蕉免费一区二区三区在线观看| 色综合夜色一区| 免费极品av一视觉盛宴| av在线中文| 91在线视频在线| 亚洲xxxx在线| 在线观看毛片av| 亚洲综合激情| 欧美极品少妇xxxxⅹ喷水| 在线观看免费黄色网址| 免费看久久久| 日韩亚洲欧美中文三级| 玩弄japan白嫩少妇hd| av老司机免费在线| 亚洲免费观看在线视频| 亚洲欧洲国产精品久久| 免费在线稳定资源站| 国产成+人+日韩+欧美+亚洲| 国产精品久久一区主播| 精品久久久久久久久久久国产字幕| 欧美成人精品| 久久天天躁狠狠躁夜夜躁2014| 欧美大波大乳巨大乳| 美女福利一区| 亚洲国产精品久久91精品| 制服下的诱惑暮生| 精品一区二区三区视频在线播放| 欧美色图天堂网| aaa毛片在线观看| 自拍偷拍亚洲视频| 精品久久久久久久久久久| 精品少妇人欧美激情在线观看| av免费在线免费观看| 亚洲欧美激情小说另类| 激情五月五月婷婷| 伊人福利在线| 一区二区三区色| 老司机激情视频| 日本在线观看高清完整版| 亚洲另类在线制服丝袜| 日韩在线视频在线| 菠萝蜜视频在线观看www入口| 亚洲免费电影在线| 欧美 亚洲 视频| 久久香蕉一区| 香蕉影视欧美成人| 国产真实乱子伦| 成人影院大全| 欧美无人高清视频在线观看| 亚洲最大综合网| 日本黄色成人| 欧美v国产在线一区二区三区| 中文字幕 欧美 日韩| 97久久综合精品久久久综合| 亚洲第一福利在线观看| 美女脱光内衣内裤| 四虎成人精品永久免费av九九| 色阁综合伊人av| www.99re7| 亚洲欧洲日本一区二区三区| 51精品在线观看| 中文在线观看av| 国产电影一区二区三区| 极品日韩久久| 在线观看完整版免费| 亚洲精品视频在线观看免费| 国产精品又粗又长| jizz亚洲女人高潮大叫| 欧美一二三四在线| 国产乱了高清露脸对白| 日韩av大片| 久久久久久久av| 色老头在线视频| 国产精品一区二区三区网站| 精品一区二区三区免费毛片| 98在线视频| 亚洲永久免费视频| 午夜激情福利在线| av日韩精品| 伊人久久男人天堂| 久久久久久久伊人| 免费xxxx性欧美18vr| www 成人av com| 国产在线中文字幕| 亚洲综合激情小说| 午夜激情在线观看视频| 高清日韩欧美| 精品国偷自产在线| 亚洲国产av一区二区三区| 国产精品一区二区男女羞羞无遮挡| 精选一区二区三区四区五区| www久久日com| 在线免费av一区| 日本少妇xxxx| 66视频精品| 国产精品aaaa| 天天干,天天操,天天射| 亚洲日本青草视频在线怡红院| 情侣黄网站免费看| 免费萌白酱国产一区二区三区| 免费不卡在线观看av| 日韩欧美一级大片| 97se亚洲国产综合自在线 | 国产在线一级片| 国产成都精品91一区二区三 | 亚洲一区在线| 国产成人精品最新| 天天摸天天碰天天爽天天弄| 亚洲男同1069视频| 亚洲综合av在线播放| 精品久久视频| 国产999视频| 视频国产在线观看| 精品久久久久久久久国产字幕| 超碰中文字幕在线观看| 久久精品播放| 国产精品久久久久久久美男| 飘雪影院手机免费高清版在线观看 | 亚洲高潮无码久久| 狠狠久久综合| 一本一道久久a久久精品逆3p| 国产女同在线观看| 成人福利在线看| 轻点好疼好大好爽视频| 日韩一区二区三区高清在线观看| 久久九九免费视频| 97久久人国产精品婷婷| 国产精品三级电影| 亚洲一级片网站| 日韩理论在线| 国产一区二中文字幕在线看| 精品欧美色视频网站在线观看| 欧美写真视频网站| 国产视频123区| 另类成人小视频在线| 免费在线观看污污视频| 精品国产亚洲一区二区三区大结局 | 欧美激情高清视频| 韩国中文字幕hd久久精品| 亚洲第一综合色| 国产一级黄色录像| 久久国产成人| 色吧亚洲视频| 小说区图片区亚洲| 欧美精品在线观看| 亚洲精品18在线观看| 亚洲成人激情综合网| 在线观看国产三级| 久久影院亚洲| 亚洲一区二区三区精品动漫| av一级久久| 欧美精品18videos性欧美| 污视频网站在线播放| 一本色道久久加勒比精品| 国产精品情侣呻吟对白视频| 精品一区二区三区欧美| 2019日韩中文字幕mv| 九九综合在线| 成人黄色av免费在线观看| 图片区小说区亚洲| 精品视频在线播放免| 亚洲午夜激情视频| 亚洲一区二区3| 在线免费观看麻豆| 国产一区二区三区四区在线观看| 日韩成人三级视频| 国产欧美亚洲精品a| 成人看片人aa| 久草在线中文最新视频| 一区二区三区亚洲| 亚洲精品久久久久久无码色欲四季| 午夜久久久久久电影| 极品人妻videosss人妻| 国产精品 日产精品 欧美精品| 黄色一级片播放| 久久美女视频| 好吊色欧美一区二区三区 | 日本亚洲欧洲色α| 操你啦在线视频| 亚洲精品自产拍| 国产有码在线观看| 狠狠久久亚洲欧美专区| 成人性生活毛片| 久久女同精品一区二区| 国产男女无遮挡猛进猛出| 日韩av中文字幕一区二区三区| 国产精品视频一二三四区| 国产一区二区三区电影在线观看 | 黄色片免费在线观看视频| 少妇精品久久久一区二区三区 | 一区二区三区免费在线视频| 午夜欧美大尺度福利影院在线看| 一区二区三区在线播放视频| 97超碰欧美中文字幕| 久久精品一二三四| 美女视频网站久久| 久久久久久久久久久免费视频| 国产一区二区三区四区老人| 亚洲视频精品一区| 欧美精品momsxxx| 韩国精品一区二区三区六区色诱| 美女精品久久| 成人看片人aa| 日本欧美在线| 国产精品久久久久久久久久三级| 国产h片在线观看| 欧美大片在线看免费观看| 欧美日韩在线看片| 一区二区三区无码高清视频| 麻豆导航在线观看| 日韩国产高清视频在线| 高潮毛片7777777毛片| 91麻豆精品91久久久久久清纯| www.亚洲激情| 在线免费观看成人短视频| 国产精品国产三级国产专区52| 亚洲综合色成人| 久久免费视频精品| 一区二区三区蜜桃| 国产高清在线免费观看| 亚洲欧美日韩小说| 免费看特级毛片| 自拍偷拍亚洲综合| 人妻人人澡人人添人人爽| 中文字幕一区二区三区色视频| 国产123在线| 国产农村妇女精品| 国产精品久久久视频| 欧美国产日韩在线观看| 免费一级特黄3大片视频| 日本一区二区视频在线观看| 免费观看a级片| 国产精品沙发午睡系列990531| 日本成人免费视频| 国产精品毛片久久久久久| 顶级黑人搡bbw搡bbbb搡| 最新日韩在线视频| 青娱乐免费在线视频| 香蕉久久一区二区不卡无毒影院| 日本一区二区不卡在线| 精品日韩美女的视频高清| av网站中文字幕| 欧美中文字幕久久| 一区二区美女视频| 欧美大片日本大片免费观看| 蜜臀av午夜精品| 亚洲激情中文字幕| 韩国三级av在线免费观看| 少妇激情综合网| 日本片在线观看| 韩国日本不卡在线| 播放一区二区| 亚洲综合色av| 日韩av黄色在线| 亚洲精品欧美精品| 欧美另类亚洲| 成人在线免费观看av| 日韩**一区毛片| 精产国品一二三区| 91在线观看一区二区| 亚洲欧美va天堂人熟伦| 亚洲欧美电影一区二区| 香蕉免费毛片视频| 欧洲激情一区二区| 亚洲av无码一区二区乱子伦| 亚洲精品日韩丝袜精品| 永久免费av在线| 久久99热这里只有精品国产| 欧美粗大gay| 亚洲aaa激情| 国产精品欧美日韩一区| 公共露出暴露狂另类av| 国产农村妇女毛片精品久久莱园子| 能在线观看的av网站| 国产成人av影院| 亚洲ⅴ国产v天堂a无码二区| 一区二区三区四区在线免费观看| 久久露脸国语精品国产91| 欧美日韩中字一区| 婷婷视频在线观看| 伦理中文字幕亚洲| 欧美自拍电影| 国产精华一区| 日韩欧美精品综合| 欧美日韩亚洲一| 国产精品自产自拍| 国产真人做爰视频免费| 亚洲成人午夜影院| 国产精品久久久久久久久久久久久久久久| 亚洲国产精品999| 黄色av电影在线播放| 日韩av免费在线观看| jizz性欧美23| 手机福利在线视频| 日韩国产一区二| 少妇一级淫片免费放播放| 亚洲女人的天堂| 亚洲一区二区影视| 亚洲视频电影图片偷拍一区| 888av在线视频| 91免费版黄色| 亚洲h色精品| 午夜免费福利视频在线观看| 久久夜色精品国产欧美乱极品| 国产一级视频在线观看| 日韩一区二区三区免费观看| 欧美性videos| 国产综合久久久久久| 欧美午夜精彩| 成人免费无码av| 久久久久久免费网| 国产精品久久久久久久久久精爆| 欧美精品一区二区三区高清aⅴ | 久久精品成人动漫| 精品免费av在线 | www.天天射.com| wwwwww.欧美系列| 国产成人自拍视频在线| 精品国精品国产| 黄网在线免费看| 肥熟一91porny丨九色丨| 在线观看国产精品入口| av噜噜在线观看| 亚洲三级在线免费观看| 国产精品一区二区人人爽| www.久久久久| www一区二区三区| 中国老女人av| 国产激情偷乱视频一区二区三区| 欧美a级片免费看| 欧美精品国产精品| 黄色av网站在线播放| 91|九色|视频| 海角社区69精品视频| 亚洲少妇中文字幕| 亚洲mv在线观看| 亚洲 精品 综合 精品 自拍| 欧美一区二区三区……| 国产日产精品_国产精品毛片| 日韩欧美xxxx| 国产精品电影一区二区三区| 一区二区国产欧美| 欧美成人免费全部观看天天性色| 亚洲3区在线| 日本国产在线播放| 久久美女艺术照精彩视频福利播放| 国产寡妇亲子伦一区二区三区四区| 国产亚洲一区二区在线| 日本在线一区二区| 无颜之月在线看| 99久久国产综合精品麻豆| 国产成人精品777777| 自拍偷拍亚洲欧美| 欧美在线在线| 每日在线更新av| 国产精品国产三级国产普通话99| 国产裸体无遮挡| 97香蕉超级碰碰久久免费软件| 九九视频免费观看视频精品| 午夜免费看视频| 亚洲一二三四久久| 爱爱爱免费视频在线观看| 91在线免费视频| 国产精品老牛| 国产精品免费人成网站酒店 | 日韩女在线观看| 外国成人激情视频| v天堂中文在线| 欧美日韩一区 二区 三区 久久精品| 伊人影院在线视频| 日韩精品福利视频| 国产成a人无v码亚洲福利| 黄色污污视频软件| 欧美精品aaa| 91精品精品|