typescript學習回顧(三)

今天繼續來分享ts的相關概念,枚舉,ts模塊化,接口和類型兼容性

ts的擴展類型:類型別名,枚舉,接口和類

枚舉

基礎概念

枚舉通常用于約束某個變量的取值范圍。當然字面量和聯合類型配合使用,也可以達到同樣的目標。

為什么使用枚舉

但是使用字面量和聯合聯系會存在一個問題

  • 邏輯含義和真實值容易混淆,修改真實值的時候,會產生大量的修改
  • 字面量類型不會進入編譯結果

使用枚舉的話就不會出現這種問題

如何定義枚舉
/*
enum 枚舉名{枚舉字段1 = 值1,枚舉字段2 = 值2,..
}
*///實例enum Gender {Male = "帥哥",Female = "美女"}// 先生 女士  男 女 male  femalelet gender: Gender;gender = Gender.Male;gender = Gender.Female;

編譯后的js代碼

var Gender;
(function (Gender) {Gender["Male"] = "\u5E05\u54E5";Gender["Female"] = "\u7F8E\u5973";
})(Gender || (Gender = {}));
// 先生 女士  男 女 male  female
let gender;
gender = Gender.Male;
gender = Gender.Female;

下面給個使用聯合類型的例子

type Gender = "男" | "女";
let g:Gender;g = '女';
g = '男';

編譯后的js代碼

let g;
g = '女';
g = '男';

可以非常清晰的看出枚舉的好處,會把枚舉里的屬性也編譯到結果里面,避免了代碼里面大量的真實值。

枚舉的規則
  • 枚舉的字段值可以是字符串或數字
  • 數字枚舉的值會自動自增
enum Level {level1 : 1,level2,level3
}let l: Level = Level.level1;
console.log(l)
l = Level.level2;
console.log(l)
l = Level.level3;
console.log(l)

控制臺輸出結果

1
2
3
  • 被數字枚舉約束的變量,可以直接賦值為數字

  • 數字枚舉的編譯結果 和 字符串枚舉有差異

小練習

這里使用枚舉來做測試

//權限
enum Permission {Read = 1,   //0001Write = 2,  //0010Create = 4, //0100Delete = 8  //1000
}//1.使用或運算組合權限
let p: Permission = Permission.Read | Permission.Write;//這樣p就具備read和write權限//2.判斷是否擁有某個權限,使用&,且運算兩邊都是1才為1
function hasPermisson(target: Permission, per: Permission) {return (target & per) === per;
}//3.如何刪除某個權限
//通過異或運算,相同取0,不同取1
p = p ^ Permission.Write;

模塊化

配置名稱含義
module設置編譯結果中使用的模塊化標準
moduleResolution設置解析模塊的模式
noImplicitUseStrict編譯結果中不包含"use strict"
removeComments編譯結果移除注釋
noEmitOnError錯誤時不生成編譯結果
esModuleInterop啟動es模塊化交互非es模塊導出

前端模塊化標準:ES6、commonjs、amd、umd、system,esnext

TS中如何書寫模塊化語句

TS中,導入和導出模塊,統一使用ES6的模塊化標準

編譯結果中的模塊化

可配置

TS中的模塊化在編譯結果中:

  • 如果編譯結果的模塊化標準是ES6:沒有區別
  • 如果編譯結果的模塊化標準是commonjs:導出的聲明會變成exports的屬性,默認的導出會變成exports的default屬性;

默認是用的es6語法

import fs from "fs";
import myModule from "./myModule";
如何在TS中書寫commonjs模塊化代碼

如果想用commonjs語法的話需要在tsconfig.json里面配置

{"compilerOptions": { //編譯選項"module": "CommonJS", //配置編譯目標使用的模塊化標準},
}

代碼:

//導出
export = xxx//導入
import xxx = require(xxx)

示例

//modules.ts
export = {name: 'kakarote',sum(a: number, b: number) {return a + b;}
}//index.ts
import myModule = require('./myModule');
模塊解析

關于ts的一個模塊解析策略,它有兩種模塊解析策略

具體可以查看中文網:https://www.tslang.cn/docs/handbook/module-resolution.html,也可以去官網里查看

  • classic:經典模塊解析策

    //一、對于相對路徑引入的模塊流程
    //root/src/folder/A.ts
    import { b } from "./moduleB"//這樣引入的話首先它會查找
    //1. /root/src/folder/moduleB.ts
    //2. /root/src/folder/moduleB.d.ts//二、對于非相對路徑的導入
    //編譯器則會從包含導入文件的目錄開始依次向上級目錄遍歷,嘗試定位匹配的聲明文件。
    //root/src/folder/A.ts
    import { b } from "moduleB"
    //它會這么查找
    //1./root/src/folder/moduleB.ts
    //2./root/src/folder/moduleB.d.ts
    //3./root/src/moduleB.ts
    //4./root/src/moduleB.d.ts
    //5./root/moduleB.ts
    //6./root/moduleB.d.ts
    //7./moduleB.ts
    //8./moduleB.d.ts
    
  • node:模塊解析策略

    //一、對于相對路徑引入的解析模塊流程
    ///root/src/moduleA.js
    var x = require("./moduleB");//1.它會監測:/root/src/moduleB.js文件是否存在
    //2.監測/root/src/moduleB目錄是否包含package.json模塊,如果package.json指定了main模塊,包含了{ "main": "lib/mainModule.js" },那么它就會引用/root/src/moduleB/lib/mainModule.js
    //3.監測/root/src/moduleB目錄是否包含index.js,如果存在它就會被當做那個文件夾的main模塊//二、非相對模塊的解析流程
    ///root/src/moduleA.js
    var x = require("moduleB")//1./root/src/node_modules/moduleB.js
    //2./root/src/node_modules/moduleB/package.json (如果指定了"main"屬性)
    //3./root/src/node_modules/moduleB/index.js//4./root/node_modules/moduleB.js
    //5./root/node_modules/moduleB/package.json (如果指定了"main"屬性)
    //6.root/node_modules/moduleB/index.js//7./node_modules/moduleB.js
    //8./node_modules/moduleB/package.json (如果指定了"main"屬性)
    //9./node_modules/moduleB/index.js注意Node.js在步驟(4)和(7)會向上跳一級目錄。
    

接口

TypeScript的接口:用于約束類、對象、函數的契約(標準)

契約(標準)的形式

  • API文檔,弱標準

  • 代碼約束,強標準

和類型別名一樣,接口,不出現在編譯結果中

接口約束對象
interface User {name: stringage: numbersayHello: () => void
}//定義類型別名
// type User = {
//     name: string,
//     age: number,
//     sayHello: () => void
// }let u: User = {name: "sdsad",age: 33,sayHello() {console.log('asdasdsasa')}
}

接口可以繼承

class Banner extends React.Component{}

可以通過接口之間的繼承,實現多種接口的組合

使用類型別名可以實現類型的組合效果,需要通過&,它叫做交叉類型

它們的區別:

  • 子接口不能覆蓋父接口的成員
  • 交叉類型會把相同成員的類型進行交叉

readonly

只讀修飾符,修飾的目標是只讀

只讀修飾符不在編譯結果中

類型兼容性

B->A,如果能完成賦值,則B和A類型兼容

鴨子辨型法(子結構辨型法):目標類型需要某一些特征,賦值類型只要能滿足該特征即可

例子:

interface Duck {sound: "嘎嘎嘎",swim(): void
}let person:Duck = {name: "偽裝成鴨子的人",age: 1,sound: "嘎嘎嘎" as "嘎嘎嘎",swim() {console.log(this.name + '正在游泳,并發出了' + this.sound + "的聲音")}
}

如果直接給person設置Duck類型約束會報錯

在這里插入圖片描述

但是可以使用下面這種方式

interface Duck {sound: "嘎嘎嘎",swim(): void
}let person = {name: "偽裝成鴨子的人",age: 1,sound: "嘎嘎嘎" as "嘎嘎嘎",swim() {console.log(this.name + '正在游泳,并發出了' + this.sound + "的聲音")}
}let duck: Duck = person;

如果直接用對象的字面量形式就會報錯,但是賦值的形式它就會忽略,只要有sound和swim就不會報錯

在這里插入圖片描述

函數類型

我們可以看到arr的forEach的一個函數的ts定義

forEach(callbackfn: (value: number, index: number, array: number[]) => void, thisArg?: any): void

它這里要求這個回調函數的參數有這些,value,index,array,但是這里我們傳遞的時候可以少傳遞,但是不能多傳遞。

[34, 3].forEach(it => console.log(it));

Tips:

參數值:傳遞給目標函數參數可以少,不能多

返回值:如果函數要求返回一定要返回,不要求返回則可以隨意

結語

今天的學習回顧就到這里了!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38749.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38749.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis 配置詳解

文章目錄 Redis 配置詳解網絡持久化復制安全客戶端內存管理延遲釋放僅追加模式LUA集群慢指令延遲監控事件通知高級配置主動碎片整理 Redis 配置詳解 網絡 ########################## NETWORK ########################## bind:指定 Redis 只接收來自于特定 IP 地…

Linux 高級編程——線程控制

線程控制:互斥與同步 概念: 互斥 》在多線程中對臨界資源的排他性訪問。 互斥機制 》互斥鎖 》保證臨界資源的 訪問控制。 pthread_mutex_t mutex; 互斥鎖類型 互斥鎖變量 內核對象 框架: 定義互斥鎖 》初始化鎖 》加…

前端——在本地搭建Vue單頁應用

目錄 1、安裝最新node.js 2、打開命令行窗口 3、進入要保存項目的目錄下 4、安裝 Vue CLI 5、創建新項目,選擇功能 5.1 新建項目 5.2 Please pick a preset 5.3 Check the features needed for your project 5.4 Choose a version of Vue.js 5.5 Use hist…

Android13 串口控制是能wifi adb實現

Android13 串口控制是能wifi adb實現 文章目錄 一、前言二、Android 串口控制是能wifi adb實現1、通過Settings屬性控制2、通過prop屬性控制3、wifi adb 對應的Settings屬性和prop屬性關系(1)屬性監聽(2)相關代碼位置(…

優化數據庫字段使用位運算-php語言示例

背景:一個會員有三個狀態,A、B、C,其中一個人可以為 A、B、C、AB;之前數據表結構加了三個字段is_a、is_b、is_c; 本人實在不想這樣粗糙的實現需求,遂決定用位運算優化。 上代碼: 位運算可以用來處理狀態值…

探索SOLIDWORKS 2024設計增強功能

隨著技術的不斷進步和市場的日益競爭,工程設計和制造行業對于快捷、準確和創新的工具需求日益增長。SOLIDWORKS作為3D CAD設計軟件,一直致力于為用戶提供更強大、更便捷的設計工具。SOLIDWORKS 2024的發布,再次證明了其在設計增強功能方面的持…

使用 Amazon Bedrock Converse API 簡化大語言模型交互

本文將介紹如何使用 Amazon Bedrock 最新推出的 Converse API,來簡化與各種大型語言模型的交互。該 API 提供了一致的接口,可以無縫調用各種大型模型,從而消除了需要自己編寫復雜輔助功能函數的重復性工作。文中示例將展示它相比于以前針對每…

如何在Windows上使用Docker搭建PHP開發環境

前言 在本地搭建開發環境我好像沒幾年就要折騰一次,因為本地開發電腦使用的是windows,早些年的時候,用過很多類似WAMP之類的東西,但最終都有或多或少不滿意的地方,前兩年的時候,還折騰過WSL,但…

批量文件名修改軟件:一鍵解決同一編碼多型號文件分類與命名難題,高效管理文件

在數字化時代,圖片文件已經成為我們工作中不可或缺的一部分。然而,當面對成百上千個同一編碼下不同型號的圖片文件時,如何快速、準確地進行分類和命名,成為了許多職場人士頭疼的問題。現在,我們為您帶來了一款神奇的批…

MyBatisPlus 基礎數據表的增刪改查 入門 簡單查詢

MyBatisPlus MyBatisPlus(簡稱MP)是一個基于MyBatis的增強工具庫,簡化了MyBatis的開發,提供了很多實用的功能和特性,如自動生成SQL、通用CRUD操作、分頁插件、條件構造器、代碼生成器等。它不僅簡化了開發過程&#x…

2024海亮日記

寫在前面:長文預警 20240617 聽說要去海亮,不考(補考)期末考試,于是進行一個停課的辦理,第一次進入410,被逆天的配置和氣氛所震驚 發誓這回去HL一定要有好效果,于是制定了詳細的計…

golang 未指定類型interface{} 類型的 int類型數據json.Unmarshal 解碼后變成float64類型問題解決方法

golang內置的json反序列化方法,默認情況下對應 未指定類型interface{} 類型的的 int類型數據在經過Unmarshal解碼后 int類型的數據會變成 float64類型。 因為json里面默認將interface{}類型的int數據都當做float64來處理。 解決方法很簡單,就是使用自定…

優盤有盤符顯示0字節:故障解析與數據恢復策略

一、優盤有盤符顯示0字節現象描述 在使用優盤的過程中,我們有時會遇到一種令人困惑的情況:插入優盤后,電腦能正常識別到優盤的盤符,但當我們嘗試訪問其中的數據時,卻發現優盤的容量顯示為0字節,無法讀取或…

快速掌握MyBatis

MyBatis 是一個流行的 Java 持久層框架,它提供了一種半自動的 SQL 映射方式,使得開發者能夠更加靈活地編寫 SQL 語句,同時避免了傳統 JDBC 代碼的冗余和復雜性。下面進行簡要概述: MyBatis 快速掌握 核心概念:理解 My…

8.1 Firmware Update Process

8.1 Firmware Update Process 通過reset激活firmware 更新的過程: host發出firmare下載命令,將FW image下載到控制器。FW image可能有多個部分要下載,因此FW image 下載命令中指定正在下載的FW image的每個部分的偏移量。FW image 下載命令…

Sui創始團隊在競速環節中的快問快答

在Sui Basecamp活動期間,Sui區塊鏈的最初貢獻者在Oracle紅牛賽車模擬器上展示了他們的技術能力,在駕駛圈時回答了有關Sui的問題。 Evan Cheng(又名Revvin’ Evan)在解釋Mysticeti創下區塊鏈最終性記錄的同時保持著他的駕駛線路。…

Java | Leetcode Java題解之第200題島嶼數量

題目&#xff1a; 題解&#xff1a; class Solution {void dfs(char[][] grid, int r, int c) {int nr grid.length;int nc grid[0].length;if (r < 0 || c < 0 || r > nr || c > nc || grid[r][c] 0) {return;}grid[r][c] 0;dfs(grid, r - 1, c);dfs(grid, r…

go Channel原理 (三)

Channel 設計原理 不要通過共享內存的方式進行通信&#xff0c;而是應該通過通信的方式共享內存。 在主流編程語言中&#xff0c;多個線程傳遞數據的方式一般都是共享內存。 Go 可以使用共享內存加互斥鎖進行通信&#xff0c;同時也提供了一種不同的并發模型&#xff0c;即通…

【嵌入式——FreeRTOS】任務

【嵌入式——FreeRTOS】任務 任務創建和刪除動態方式創建任務靜態方式創建任務 刪除任務任務切換調度器任務切換流程 任務掛起任務恢復相關API函數 任務創建和刪除 動態方式創建任務 任務的任務控制塊以及任務的棧空間所需的內存&#xff0c;均由freeRTOS從freeRTOS管理的堆中…

c#asp.net中字典的使用

字典是一個鍵值對&#xff0c;可以用來保存數據&#xff0c;再查詢&#xff1b; 下面是一個案例&#xff1a;依據多個學號查詢多個學生的姓名&#xff0c;只能到數據庫查詢一次數據&#xff01;&#xff01;&#xff01; 先在數據庫查詢學號對應的學生&#xff0c;把數據保存在…