TypeScript全解:類型(下)

何時(shí)用enum類型

當(dāng)前端遇到這種需求的時(shí)候:

前端需要顯示后端返回的狀態(tài) 1,2嚼吞,3盒件,4,還要傳輸這個(gè)值回去舱禽,

但是我們經(jīng)常會(huì)忘記這個(gè)值是什么意思炒刁,這個(gè)時(shí)候就可以使用 enum

??:二進(jìn)制權(quán)限

enum Permission {
  None = 0,
  Read = 1 << 0, // 0001 // 這里的 << 是左移操作,1在二進(jìn)制表示為 00..001誊稚,那么左移一位就是 00..010
  Write = 1 << 1, // 0010
  Delete = 1 << 2, //0100
  Manage = Read | Write | Delete, // 0111 // 這個(gè)的 | 是并操作翔始,取二進(jìn)制各個(gè)位置的 1 為結(jié)果
}

const user1: { permission: Permission } = { permission: 0b0101 };

// 這里的 & 是與操作,取二進(jìn)制各個(gè)位置同時(shí)為 1的為結(jié)果
if ((user1.permission & Permission.Write) === Permission.Write) {
  console.log("擁有寫權(quán)限")
}
if ((user1.permission & Permission.Manage) === Permission.Manage) {
  console.log("擁有管理權(quán)限")
}

何時(shí)不用 enum

并不是說不能用里伯,而是這時(shí)候用會(huì)顯得很呆

enum Fruit {
  apple = 'apple',
  banana = 'banana',
  pineapple = 'pineapple',
  watermelon = 'watermelon',
}

let f = Fruit.apple; // 這里甚至不能寫 'apple'
f = Fruit.pineapple

幾乎等價(jià)于

type Fruit = 'apple' | 'banana' | 'pineapple' | 'watermelon'

let f = 'apple'
f = 'pineapple'

結(jié)論

  • number enum √
  • string enum ×
  • other enum ×

個(gè)人也覺得在 JS 中不太實(shí)用城瞎,在沒有 enum 的時(shí)候 JS 程序員就在用對(duì)象表示了,而且還比不上對(duì)象好用:

const PERMISSION = {
  0: 'read',
  1: 'write',
  2: 'delete',
  3: 'manage'
}

也幾乎是一樣的效果疾瓮,無論有沒有 enum脖镀,也能用的好好的,最多可能性能上沒有 enum 好狼电,又不是不能用认然,建議是能不用就不用

type與interfacer的區(qū)別

何時(shí)用 type补憾?

答案是什么時(shí)候都可以,幾乎沒有不能用的場(chǎng)合

type 又叫類型別名卷员,英文 Type Alias盈匾,簡(jiǎn)單來說就給其他類型取個(gè)名字

比如說我們可以給 string 換個(gè)名字,以下這樣幾乎是等價(jià)的:

type Name = string;

const a: Name = 'hi'

等等其他復(fù)雜類型都可以用 type毕骡,這里只說一種特殊情況削饵,帶有屬性的函數(shù):

type Fn = (a: number) => void // 純函數(shù),沒有屬性
type FnWithProp = {
  (a: number): void; // 這里來聲明函數(shù)未巫,語法很奇怪把~
  prop: string;
}

為何要叫做類型別名窿撬,不叫做類型聲明

因?yàn)?ts 一開始并沒有想要記住這個(gè)名字,比如說:

type A = string;
type B = A

請(qǐng)問此時(shí) B 的類型是什么叙凡,應(yīng)該是 A 把劈伴,
但是其實(shí)是 string,A 沒有被記住

何時(shí)用 interface

interface 又叫聲明接口握爷,

接口是什么跛璧?你翻過的 JS 教程中,從來沒有提到過這個(gè)單詞新啼,那是那個(gè)理論講到這個(gè)呢追城?是面向?qū)ο蟆s 為了滿足這些人燥撞,搞了一個(gè)接口出來座柱。

此接口非彼接口,還是對(duì)象物舒,描述對(duì)象的屬性(declare the shapes of objects)

// 描述普通對(duì)象
interface A {
  name: string;
  age: number;
}

// 描述數(shù)組
interface A extends Array<string>{
  name: string;
}
// 如何用 type 實(shí)現(xiàn)上述效果
type A2 = Array<string> & { name: string; }

// 描述函數(shù)
interface Fn {
  (a: number): void;
}
// 描述帶成員的函數(shù)
interface Fn {
  (a: number): void;
  prop: string;
}

// 描述日期對(duì)象
interface D extends Date {}

type 不可重新賦值

這個(gè)既是優(yōu)點(diǎn)也是缺點(diǎn)

type A = number;

A = string // 報(bào)錯(cuò)色洞,沒有這種語法

好處是提升效率,聲明什么就是什么冠胯,不用管以后你還會(huì)變火诸,當(dāng)然帶來的缺點(diǎn)則是不好拓展

interface 能自動(dòng)合并

比如在我們經(jīng)常使用的 axios 上:

// custom.d.ts
import { AxiosRTequestConfig } from 'axios'

declare module 'axios' {
  export interface  AxiosRequestConfig {
    _autoLoading?: boolean;
  }
}
axios.get('/list', {
  _autoLoading: true // 拓展出來的
})

比如拓展 String:

declare global {
  interface String {
    newFn(x: string): void
  }
}

const s = 'string'
s.newFn('xxx') // 此時(shí)不會(huì)報(bào)錯(cuò)

小結(jié)

  • 區(qū)別1:
    • interface 只描述對(duì)象
    • type 則描述所有數(shù)據(jù)
  • 區(qū)別2:
    • type 只是別名
    • interface 則是類型聲明
  • 區(qū)別3:
    • 對(duì)外 API 盡量用 interface,方便拓展
    • 對(duì)內(nèi) API 盡量用 type涵叮,防止代碼分散

看起來 type 的應(yīng)用范圍更廣惭蹂,且包括 interface,看起來 interface 沒有必要出現(xiàn)割粮。其實(shí)是原因之一為了迎合面向?qū)ο蠓劢z的需求

聽說 type 不能繼承盾碗?

瞎說!

繼承的本質(zhì)是什么舀瓢?就是一個(gè)東西擁有另一個(gè)東西的屬性

這個(gè)東西很容易實(shí)現(xiàn)廷雅,比如說復(fù)制

那 type 怎么拓展?

type MyAxiosRTequestConfig  = AxiosRTequestConfig  & { _autoLoading?: boolean; }

幾乎是一樣的效果,而且更安全航缀,不會(huì)修改到原先的類型商架。

總結(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市芥玉,隨后出現(xiàn)的幾起案子蛇摸,更是在濱河造成了極大的恐慌,老刑警劉巖灿巧,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赶袄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抠藕,警方通過查閱死者的電腦和手機(jī)饿肺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾似,“玉大人敬辣,你說我怎么就攤上這事×阍海” “怎么了溉跃?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)门粪。 經(jīng)常有香客問我喊积,道長(zhǎng)烹困,這世上最難降的妖魔是什么玄妈? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮髓梅,結(jié)果婚禮上拟蜻,老公的妹妹穿的比我還像新娘。我一直安慰自己枯饿,他們只是感情好酝锅,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奢方,像睡著了一般搔扁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟋字,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天稿蹲,我揣著相機(jī)與錄音,去河邊找鬼鹊奖。 笑死苛聘,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播设哗,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼唱捣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了网梢?” 一聲冷哼從身側(cè)響起震缭,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎战虏,沒想到半個(gè)月后蛀序,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡活烙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年徐裸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啸盏。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡重贺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出回懦,到底是詐尸還是另有隱情气笙,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布怯晕,位于F島的核電站潜圃,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舟茶。R本人自食惡果不足惜谭期,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吧凉。 院中可真熱鬧隧出,春花似錦、人聲如沸阀捅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饲鄙。三九已至凄诞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忍级,已是汗流浹背帆谍。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颤练,地道東北人既忆。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓驱负,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親患雇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跃脊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容