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