TypeScript中的數(shù)據(jù)類型enum?type?interface基礎(chǔ)用法示例
一. enum,何時去使用enum
enum用于映射,以下是基本用法
enum?A?{ ??todo?=?0,?//?表示todo等于0,往下依次增加 ??done, ??archived, ??deleted, } let?orderStatus?=?0; orderStatus?=?A.todo; orderStatus?=?A.done; console.log(orderStatus);
通過位運算和enums做權(quán)限控制
enum?Permission?{ ??None?=?0,?//?0000 ??Read?=?1?<<?0,?//?0001 ??Write?=?1?<<?1,?//?0010 ??Delete?=?1?<<?2,?//?0100 ??Manage?=?Read?|?Write?|?Delete,?//?二進制的或?//?0111 } type?User?=?{ ??permission:?Permission; }; const?user:?User?=?{ ??permission:?0b0111, };?//?這個值應(yīng)該是從后臺獲取 //?用二進制表示權(quán)限,若user.permission&Permission.Write?===?Permission.Write?則user.permission有Permission.Write的所有1 if?((user.permission?&?Permission.Write)?===?Permission.Write)?{ ??console.log('擁有寫權(quán)限'); }
二. 什么時候用enum會顯得很呆
//?以下這種場景就很呆,不如用type+并集 enum?Fruit?{ ??apple?=?'apple', ??banana?=?'banana', ??pineapple?=?'pineapple', ??watermelon?=?'watermelon', } let?f:?Fruit?=?Fruit.apple; f?=?Fruit.watermelon; console.log(f);
對比直接用type+并集的方式
//?用type加并集 type?Fruit?=?'apple'?|?'banana'?|?'watermelon'?|?'pineapple'; let?f:?Fruit?=?'banana'; f?=?'watermelon'; console.log(f);
總結(jié): number + enum 不錯,string 和 混用的情況都不太合適,如果沒有enum在js中我們可以用map來替代
三. type和interface的區(qū)別
什么時候用type?
幾乎沒有不能用type的場景,它的官方名稱應(yīng)該叫做類型別名(Type Aliases),也就是給其它類型取一個名字
type?Name?=?string; const?a:?Name?=?'hi'; type?FalseLike?=?0?|?''?|?null?|?undefined?|?false; //?比較特殊的帶有屬性的函數(shù)的聲明方式 type?FnWithProp?=?{ ??(a:?number,?b:?number):?number; ??prop:?string; }; const?f:?FnWithProp?=?(x,?y)?=>?{ ??return?x?+?y; }; f.prop?=?'hello';
為什么叫做類型別名
type?A?=?string; type?B?=?A;?//?B?實際上的類型還是string,不是A,也就是說type聲明的是一個類型的別名,沒有產(chǎn)生新的類型
什么時候用interface
接口interface是面向?qū)ο罄锩娴母拍?,它表示class需要有的一些功能,ts中的功能不僅能描述功能也能描述對象的屬性
type?A1?=?Array<string>?&?{ ??name:?string; }?&?X; interface?X?{ ??age:?number; } //?interface就是用面向?qū)ο蟮暮谠?,把type能做的事情再描述一遍 interface?A2?extends?Array<string>,?X?{ ??name:?string; }
interface描述函數(shù)
interface?Fn?{ ??(a:?number,?b:?number):?number; ??xxx:?number; } const?f:?Fn?=?(x,?y)?=>?{ ??return?x?+?y; }; f.xxx?=?1; console.log(f);
描述日期對象
interface?D?extends?Date?{ } const?d:?D?=?new?Date(); console.log(d);
type和interface的范圍
type也能描述對象,是不是就不需要interface? 我感覺并非如此,主要有兩點。第一點,其實interface這個特性的出現(xiàn)迎合了面向?qū)ο蟮姆劢z的需要,有助于typescript這門語言的推廣傳播。 第二點之后我會細說。
區(qū)別
- interface只描述對象,type則描述所有區(qū)別
- type 只是別名interface則是類型聲明
四. type和interface的第三個區(qū)別
type的重要特性: type不可以重新賦值,這樣的好處計算非???,但是缺點就是type不好擴展
type?A?=?number;
interface可以自動合并,所以可以被擴展
interface?X?{ ??name:?string; } interface?X?{ ??age:?number; } const?a:?X?=?{ ??name:?'frank', ??age:?18, };
interface擴展的例子
//?擴展axios import?{AxiosRequestConfig}?from?'axios' declare?module?'axios'?{ ??export?interface?AxiosRequestConfig?{ ????_autoLoading?:?boolean; ????_mock?:?string; ??} } //?擴展string interface?String?{ ??padZero(length:?number):?string; } const?s?=?'hello'; s.padZero(1);
總結(jié)
對外API盡量使用interface,方便擴展,對內(nèi)API盡量用type,防止代碼分散
以上就是TypeScript中的數(shù)據(jù)類型enum type interface基礎(chǔ)用法示例的詳細內(nèi)容,更多關(guān)于TypeScript數(shù)據(jù)類型enum type interface的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
TypeScript類型編程中的extends和infer示例解析
這篇文章主要為大家介紹了TypeScript類型編程中的extends和infer示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08TypeScript數(shù)據(jù)結(jié)構(gòu)鏈表結(jié)構(gòu)?LinkedList教程及面試
這篇文章主要為大家介紹了TypeScript數(shù)據(jù)結(jié)構(gòu)鏈表結(jié)構(gòu)?LinkedList教程及面試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02ts?類型體操?Chainable?Options?可鏈式選項示例詳解
這篇文章主要為大家介紹了ts?類型體操?Chainable?Options?可鏈式選項示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09layui.layer彈出層(子頁面)改變父頁面內(nèi)容(訪問元素和函數(shù))
當前頁面(父框架或父頁面)使用layer以iframe層的方式彈出新的窗口(子框架或子頁面)時,如何在子頁面中訪問父頁面的元素和函數(shù),從而改變父元素的頁面顯示,給用戶合理舒適的體驗。2023-02-02ThreeJS使用紋理貼圖創(chuàng)建一個我的世界草地方塊
這篇文章主要為大家介紹了ThreeJS使用紋理貼圖創(chuàng)建一個我的世界草地方塊的實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06TypeScript類型any never void和unknown使用場景區(qū)別
這篇文章主要為大家介紹了TypeScript類型any never void和unknown使用場景區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10