TypeScript類型使用示例剖析
JavaScript的內(nèi)置類型 VS TypeScript內(nèi)置類型
JS | TS | 備注 | 類型 |
---|---|---|---|
number | number | 基礎(chǔ)類型 | |
string | string | 基礎(chǔ)類型 | |
boolean | boolean | 基礎(chǔ)類型 | |
undefined | undefined | 基礎(chǔ)類型 | |
null | null | 基礎(chǔ)類型 | |
symbol | symbol | ES6新增 | 基礎(chǔ)類型 |
bigint | bigint | ES11新增 | 基礎(chǔ)類型 |
Object | object 或 字面量描述 | - | 對象類型 |
Array | Array<T> 或 元祖描述 | ES6新增 | 對象類型 |
Promise | Promise<T> | ES6新增 | 對象類型 |
Date | Date | - | 對象類型 |
RegExp | RegExp | - | 對象類型 |
Map、Set | Map<Key, Value> | ES6新增 | 對象類型 |
..... | 對象類型 |
除此之外,TypeScript又單獨提出了三種
類型,分別是元祖(Tuple)、接口(Interface)、枚舉(Enum)
元祖
元素個數(shù)和類型固定的數(shù)組
type Tuple = [number, string];
接口interface
可以描述函數(shù)、對象、構(gòu)造器的結(jié)構(gòu)
描述對象
interface Person { name: string; age: number; } const personObj: Person = { name: 'zhangsan', age: 18 } // 如果對象的屬性不是固定的,可以考慮使用索引簽名進行類型聲明 interface Person { name: string; age: number; [prop: string]: string | number; }
描述函數(shù)
interface GetDataInterface { (name: string):string; } const getData: GetDataInterface = (name) => { return `${name}你好` }
描述構(gòu)造器
interface Person { name: string; age: number; } interface PersonConstructor{ new (name: string, age: number): Person; } function createPerson(ctor: PersonConstructor): Person{ return new ctor('zhangsan', 18); } // 使用createPerson案例 class Employee { public name: string; public age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } } createPerson(Employee);
interface和type有什么區(qū)別?
枚舉
數(shù)字枚舉
enum DataEnum { A, B, C } console.log(DataEnum[0]);//反向映射 輸出 A console.log(DataEnum[1]); //反向映射 輸出 B console.log(DataEnum['A']); //正向映射 輸出 0
編譯后的代碼
字符串枚舉
enum DataEnum { ThisA = 'A', ThisB = 'B', ThisC = 'C' } console.log(DataEnum['ThisA']); // 輸出 A
編譯后的代碼
常量枚舉
- 編譯階段生成的對象會被刪除
- 常量枚舉成員在使用的地方被內(nèi)聯(lián)進來
- 不存在映射關(guān)系,而且只能正向訪問,不能 Directions[0] 這種使用
const enum Directions { Up, Down, Left, Right } console.log(Directions.Up);
編譯后的代碼
上圖編譯后的代碼是符合ts常量枚舉的概念的,但是你會發(fā)現(xiàn),當(dāng)常量枚舉和react、vue結(jié)合使用的時候,編譯后的代碼并不會刪除映射對象,編譯后常量枚舉和普通枚舉沒有區(qū)別,這又是為什么吶?
目前TypeScript受限于babel限制無法支持常量枚舉const enum,Babel是一個語法轉(zhuǎn)換器,是逐個腳步一個個編譯的,無法處理跨文件的源碼更新。例如type.ts文件內(nèi)導(dǎo)出一個常量枚舉,這個常量枚舉被多個文件使用,Babel是單個文件編譯,并不會根據(jù)多個入口對type.ts進行重復(fù)編譯,所以導(dǎo)致babel編譯TS時不支持const enum,會將其當(dāng)初普通enum處理。
怎么讓Babel支持const enum?
Babel V7.15.0+版本,使用 @babel/plugin-transform-typescript插件,配置### optimizeConstEnums
為true,可以讓Babel編譯TS時,如果常量枚舉是文件內(nèi)聯(lián),沒有export導(dǎo)出,會當(dāng)成常量枚舉進行編譯。如果進行了export導(dǎo)出,同樣還是會當(dāng)初普通枚舉編譯,這是因為Babel的逐個編譯單個文件特性
導(dǎo)致
字面量類型
字面量類型也就是例如 111、'aaaa'、{a: 1}這種值也可以作為類型。其主要分為兩類:
- 第一類是
普通的字面量類型
,就是111、'aaa'、{a: 1}這種。 - 第二類是
模板字面量類型
,比如test${string}
表示以test開頭的字符串
functon getData(name: `test${string}`){ }
特殊類型
- never 代表不可達(dá),比如函數(shù)拋出異常的時候,就是返回never
- void 代表空,可以是undefined或never
- any 任意類型,任意類型可以復(fù)制給它,它也可以賦值給任意類型(never除外)
- unknown 是未知類型,任何類型都可以賦值給它,但是它不可以賦值給別的類型
類型的裝飾
?: 可有可無
readonly: 只讀屬性,不允許修改
interface Person{ readonly name: string; age?: number; } type Tuple = [string, number, object?];
以上就是TypeScript類型使用示例剖析的詳細(xì)內(nèi)容,更多關(guān)于TypeScript類型剖析的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
小程序開發(fā)?page-container?頁面容器彈出對話框功能的實現(xiàn)
這篇文章主要介紹了小程序開發(fā)?page-container?頁面容器,彈出對話框,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08如何將網(wǎng)頁表格內(nèi)容導(dǎo)入excel
這篇文章主要介紹了如何將網(wǎng)頁表格內(nèi)容導(dǎo)入excel,需要的朋友可以參考下2014-02-02json前后端數(shù)據(jù)交互相關(guān)代碼
本篇文章給大家分享了關(guān)于json前后端數(shù)據(jù)交互方法實現(xiàn)的相關(guān)知識點內(nèi)容,有興趣的讀者們可以參考學(xué)習(xí)下。2018-09-09js實現(xiàn)接收表單的值并將值拼在表單action后面的方法
這篇文章主要介紹了js實現(xiàn)接收表單的值并將值拼在表單action后面的方法,涉及JavaScript動態(tài)操作字符串及表單元素的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11基于JavaScript實現(xiàn)鼠標(biāo)懸浮彈出跟隨鼠標(biāo)移動的帶箭頭的信息層
這篇文章主要介紹了基于JavaScript實現(xiàn)鼠標(biāo)懸浮彈出跟隨鼠標(biāo)移動的帶箭頭的信息層 的相關(guān)資料,需要的朋友可以參考下2016-01-01