智能合約開發——TypeScript 基礎(全)

TS 準備

首先我們準備一個目錄,使用 dos 進入到某目錄,當然你直接 vs 打開終端執行也是沒有問題的:
在這里插入圖片描述
執行以下命令安裝 typescrip(不用進入目錄,直接安裝即可):

npm install -g typescript

我是已經安裝過了:

在這里插入圖片描述
接著你可以初始化項目(這里需要進入文件夾了,畢竟是你的項目目錄對吧,初始化項目就是以當前目錄默認初始化):

tsc --init

在這里插入圖片描述
此時你的目錄中會出現一個 tsconfig 文件:
在這里插入圖片描述

里面存儲的是一些 ts 的config ,暫時不用理,接下來就可以開始 ts 的編程了。

一、TS 編譯

安裝好 nodejs 之后,新建一個 01.ts 文件:
在這里插入圖片描述
編寫代碼:

console.log("HI") 

由于 ts 最終將會編譯生成 js,你在 ts 中直接寫 js 是沒有問題的(并且ts不是一個全新的語言,是基于 js 的),在終端中輸入 node 01.ts:

在這里插入圖片描述

此時將會輸出 HI~。

二、變量定義及編譯

在 ts 變量定中需要指定的這個變量類型,這個是跟 js 大有不同,又或者說這該指定類型貫穿了整個 ts。

更改 01 代碼:

let age: number = 18;
console.log(age)

以上代碼中定義了一個 age變量,類型為 number,賦值為 18,此時在變量名之后有一個冒號,冒號右側就是對應的這個變量的類型,最終使用等于號賦值為 18。

此時由于我們私用的是 ts 的語法,你直接使用 node 話會錯誤,需要使用 tsc-node 命令對 ts 文件進行編譯:

在這里插入圖片描述
若你使用 node 命令就不是編譯了,此時將會報錯:
在這里插入圖片描述
使用 node 表示運行 js 文件,而不是 編譯 ts 文件。

在創建一個變量的時候,也可以不指定類型,直接給定一個值,這個時候 ts 會完成類型的自動推導(跟go類似),這樣就知道這個變量是什么值了,例如:

let age = 11;

三、生成 js 文件

在 ts 中,還可以直接使用 tsc 對 ts 編譯生成 js 文件:
在這里插入圖片描述
執行命令后,將會在當前目錄下生成一個 js 文件,并且這個 js 文件是對應 ts 的 js 代碼:
在這里插入圖片描述
在這里插入圖片描述
在此我們一定要注意, ts 你可以理解為是一種強制性的“規范語法”框架,在該“語法框架”下需要嚴謹的對某些動作進行處理,但最終的本質還是 js。

四、變量、數組

4.1 一般數據類型

ts 中類型有 number、string、boolean、symbol、數組、map 等,在此只介紹常見類型。

以下是對應這些類型的示例:

let age: number = 18;
let authorName: string = '1_bit';
let boolVal: boolean = true;//數組
let strs: string[] = ["1_bit", "blog", "author"];
let strOrNumber: (string | number)[] = ["1_bit", 11, "blog", "author", 22];

以上的示例中,主要看數組的定義,例如 let strs: string[] = ["1_bit", "blog", "author"];,在這段代碼中 strs 是數組名,冒號后就是對應的類型約束,在此是 string,而方括號 “ [] ” 則表示這是一個數組,在等于號右側則是這個數組中的值。

已經理解了基本的數組的 ts 數組,在查看對應的 strOrNumber 數組,在這個代碼中,用圓括號包裹了 string 和 number 并且中間使用了“或”運算的 “ | ” 鏈接,這是表示這個數組中可以存儲 string 以及 number 類型,所以在數組中可以看到 string 和 number 類型的數據都存在。

4.2 元組

學過 python 的小伙伴對元組應該很熟悉,在 ts 中的元組跟 python 中的不是很一樣,在 ts 中定義的元組你可以理解為固長、固定類型的數組,可以指定某個位置的類型以及指定整個數組的長度,以下為元組示例:

let postion: [number, number];
postion = [0.45, 0.50];console.log(postion)
console.log(postion[0])

以上代碼中 let postion: [number, number]; 為定義了一個元組,但是并沒有進行初始化,接下來直接給 postion 定義了一個值[0.45, 0.50],隨后使用 console.log 對其打印。

在此我們可以看到,數組的定義方式是之直接在變量的冒號后面使用一個類型加方括號“[]”定義一個數組,在元組中則是在方括號內編寫對應的數值類型。

運行后結果如下:
在這里插入圖片描述

4.3 any

在 ts 中不推薦使用 any 類型,你用了不就等于跟原本的 js 沒啥區別了嗎?若真的有必要使用 any 推薦臨時使用,別貫穿項目。

以下是any 的錯誤示范(語法正確,使用錯誤):

let age: any;
age = "str";
console.log(age)
console.log(typeof age)

結果如下:
在這里插入圖片描述

五、自定義類型(別名)

在 ts 中,若一個數組的類型經常使用,可以定義一個類型別名,在使用這個類型時即可簡短的通過這個別名表示這個類型:

type StuT = (string | number)[]
let stus: StuT = ["1_bit", 13, "Xi", 26]

以上示例定義了一個 type 類型,這個類型為 (string | number)[] 表示是一個字符串與數組的數組類型,接著在下一行代碼中直接創建了一個 stus 變量,指定為 StuT 類型,并且賦值有字符串和數字的值。

六、函數

6.1 基本函數

ts 語言中的自定義函數跟 go 中的有點相似,例如如下是一個 ts 中的自定義函數:

function sayHi(name: string, age: number): string {return "Hi " + name + " you " + age + " age";
}
let xiName: string = "Xi";
let xiAge: number = 19;
console.log(sayHi(xiName, xiAge));

在以上示例中 sayHi 是一個自定義函數,跟js 語法一樣,使用function 定義一個函數,在 sayHi 函數中有兩個參數,一個是 name 還有一個是 age,name 參數是一個 string 類型,age 是一個 number 類型,參數的聲明在此也是不同的,使用了 ts 的語法;還有一點不同的是在參數之后使用一個冒號說明了當前函數的返回值為一個 string,在此需要注意,這是 ts 的語法。

接著我創建了兩個邊路 xiName 以及 xiAge,用此當做參數傳入到 sayHi 之中,此時使用 ts-node 命令編譯運行我們的 ts 文件:
在這里插入圖片描述

6.2 箭頭函數

函數的編寫還有另外一種使用箭頭函數的方式:

const sayHi = (name: string, age: number): string => {return "Hi " + name + " you " + age + " age";
}
let xiName: string = "Xi";
let xiAge: number = 19;
console.log(sayHi(xiName, xiAge));

6.3 箭頭函數加強版

函數還有另外一種定義方式,可能大家都不是特別想去學習:

const sayHi: (name: string, age: number) => string = (name, age) => {return "Hi " + name + " you " + age + " age";
}

其實這個形式可以看成兩個部分:
在這里插入圖片描述
其中前半部分是為這個 sayHi 聲明一個類型,這個 sayHi 的類型是 (name: string, age: number) 由于需要指定這個函數返回值,所以使用 => string 表示當前函數返回值為 string。

接著我們再看第二個部分:
在這里插入圖片描述
這一部分就直接當做函數的內容即可,而 (name, age) 表示這個函數接收兩個參數,把之前所說明的 name 和 age 兩個變量傳入到函數,所以在此處并不用使用類型對其進行約束,在之前已經做好約束了,最后箭頭函數右側則是函數體。

函數返回值若為空則使用 void。

6.4 可選參數

可選參數在 ts 中表示這個參數可傳或不傳,非必須參數,例如我們現在修改以上示例完成需求“姓名必傳、年齡和身高為可選,傳入年齡或身高需要對應的對其進行顯示”。

若完成這個需求那么必然會有一個函數對某個值進行判斷,此時做一個檢測的函數:

function isUndefine(arg: (number | string | undefined)): boolean {let check: boolean = true;if (!arg) {check = false;}return check;
}

以上檢測 agr 參數,參數因為需要時 number、string、undefined 類型的其中一個,所以在此處設定了這個參數的類型范圍,接著有一個 Boolean 的返回值,在函數體中給了一個變量 check 為 Boolean,初始值為 true,只要 arg 不存在那么久 fase 即可,最后返回 check。

接著我們修改 sayHi 函數,修改后調用檢測參數的函數,完成內容的拼接:

const sayHi: (name: string, age?: number, height?: number) => string = (name, age, height) => {let sayStr = 'Hi ' + name;if (isUndefine(age)) {sayStr += " you " + age + " age";}if (isUndefine(height)) {sayStr += " you " + age + " age " + "height " + height;}return sayStr;
}

此時兩個 if 判斷 age 或者 height 是否存在,隨后進行拼接即可,最后返回了sayStr 這個字符串。

在這里我們可以看到,參數 age、height 在參數名后添加了一個問號,這個問號就是表示可選參數。

最終完整代碼如下:

function isUndefine(arg: (number | string | undefined)): boolean {let check: boolean = true;if (!arg) {check = false;}return check;
}const sayHi: (name: string, age?: number, height?: number) => string = (name, age, height) => {let sayStr = 'Hi ' + name;if (isUndefine(age)) {sayStr += " you " + age + " age";}if (isUndefine(height)) {sayStr += " you " + age + " age " + "height " + height;}return sayStr;
}
let xiName: string = "Xi";
let xiAge: number = 19;
console.log(sayHi(xiName, xiAge, 170));

最終傳入不同的參數將會顯示不同的結果:

在這里插入圖片描述

七、對象

在 ts 中使用對象分為聲明和定義,聲明就像類型一樣進行使用,定義則是賦予這個對象的值:

let stu: {name: string;age: number;height: number;getName(): string;getAge(): number;setName(name: string): void;setAge(age: number): void;} = {name: 'Xi',age: 11,height: 170,setName(name) {this.name = name;},setAge(age) {this.age},getName() {return this.name;},getAge() {return this.age},
}stu.setName("1_bit")
console.log(stu.getName())

以上實例中定義了一個 stu 的對象,其中包含 name、age、height 變量以及 getName 等方法,這些都可以看做是這個對象的“類型”,隨后賦值為這些“類型”的初始化,并且設定函數的實現。

在此一定要注意,你既然聲明了,那就必須要實現(若刪除一個成員變量的初始化),否則會報錯:
在這里插入圖片描述
運行結果如下:
在這里插入圖片描述

八、類

8.1 類的基本使用

在 ts 中定義一個類方式很簡單,使用 class 例如如下示例:

class Stu {public readonly name: string;public age: number;private nickname: string = '';private readonly color = 'yellow';constructor(_name: string, _age: number) {this.name = _name;this.age = _age;}public setNickName(_nick: string) {this.nickname = _nick;}public getNickName() {return this.nickname;}
}

以上示例中使用 class 創建了一個 stu 類,在這個類中定義了幾個成員變量,在這幾個成員變量中使用了 public、private 對其進行修飾,public 表公開都可以調用,private 私有,自由類內部可以調用,除了這些常規的修飾之外還有一個 readonly,readonly 表示當前字段不允許修改,若你想對其進行改動那么將會報錯:
在這里插入圖片描述
在此還需要注意,這些變量你都需要對其進行初始化,否則將會報錯。

在類中還有一個構造方法,ts 是支持構造方法的;在使用成員變量時需要使用 this 對其指向,直接使用變量名將會出錯。

ts冷笑話:在 class 中創建“函數”不需要使用 function,因為他是方法。

接著創建一個對象:

const XiaoMing = new Stu("XiaoMing", 18);
XiaoMing.setNickName("MM");
console.log(XiaoMing.getNickName());

接著使用 tc 命令編譯運行:

在這里插入圖片描述

在 ts 中類的繼承使用 extends:

class Stu1 extends Stu {public getName(): string {return this.name}
}

繼承后在 Stu1將會擁有 Stu 的成員變量和方法,使用和正常一個對象使用一致:

const XiaoMing1 = new Stu1("XiaoM", 18);
console.log(XiaoMing1.getName());

8.2 函數重載

8.3 類的兼容性

以下是一個示例,在 ts 中相同成員變量的類可以互相兼容:

class Stu1 {name: string;height: number;constructor() {this.name = "xiaoM";this.height = 170;}
}class Stu2 {name: string;height: number;constructor() {this.name = "xiaoY";this.height = 160;}
}const xiaoY: Stu1 = new Stu2()

若此時 Stu2 中多了一個成員變量呢:
在這里插入圖片描述

此時 Stu1 還是兼容于 Stu2 的,少的可以兼容于多的,若反過來是不可以的:
在這里插入圖片描述
當然多個方法也沒問題:
在這里插入圖片描述

九、接口

9.1 接口的一般使用

在 ts 中支持接口,使用關鍵字 interface:

interface stuI {height: number;name: string;getName(): string;
}

以上定義了一個接口,若需要某些變量為該接口類型,那么就需要對接口中的變量進行初始化和實現方法:

let stu: stuI = {height: 170,name: "1_bit",getName() {return this.name;}
}

實現方法很簡單,就是 let 一個變量后指定接口為類型,隨后使用花括號對其中的內容進行初始化。

接口還可以繼承,例如如下示例:

interface stuI1 extends stuI {color: string,getHeight(): number
}

以上 stuI1 繼承 stuI,并且繼承了其中的內容,在 stuI1 接口中可以為接口本身編寫 stuI1 的內容。

使用也如下使用示例(需要完全實現接口、父接口的中的內容):

let stu1: stuI1 = {height: 170,name: "1_bit",color: "yello",getName() {return this.name;},getHeight() {return this.height}
}

最后調用:

console.log(stu.getName());
console.log(stu1.getHeight());

在這里插入圖片描述

9.2 交叉類型與同名成員變量

交叉類型其實就是多個接口進行合并,如下示例:

interface BBB { name: string }
interface CCC { age: number }
interface DDD { height: number }type BCD = BBB & CCC & DDD
let val: BCD = {name: 'ccc',age: 123,height: 12121
}

交叉類型直接使用 & 對某個類型進行定義即可,之后的變量在使用這個類型的時候就必須實現這些接口中的內容。

若接口中有同名,那么那么變量就是 never 類型,表示不可能,永遠不可能。

9.2 交叉類型與同名函數參數

在同名函數中的參數同名但類型不同的情況下可以理解為同時兼容于兩個類型,例如:

interface CCC {age: number;getVl(key: number): string
}
interface DDD {height: number;getVl(key: string): string
}

以上兩個接口新增了一個同名方法 getVl,參數同名卻參數類型不同,此時就可以當成是 getVl(key: (number | string)),例如如下代碼:

type BCD = BBB & CCC & DDD
let val: BCD = {name: 'ccc',age: 123,height: 12121,getVl(key: (number | string)) {console.log(key)return "1";}
}val.getVl(233);

十、泛型 后面有時間再補

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

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

相關文章

查看MySQL的當前日期

select current_date(); 查看MySQL的當前日期轉載于:https://www.cnblogs.com/dengyg200891/p/5972698.html

【ArcGIS風暴】ArcGIS支持的柵格數據格式大全及格式轉換案例精解

ArcGIS功能異常強大,支持多種常見的柵格數據格式,并可實現多個柵格格式的自由轉換。 在ArcGIS中,常見的柵格數據格式有:TIFF、BMP、ENVI、Esri BIL、Esri BIP、Esri BSQ、GIF、GRID、IMAGINE Image、JP2、JPG、和PNG。 BIL —Esri 波段按行交叉格式文件BIP —Esri 波段按像…

Android之靠譜的獲取本地相冊圖片

1、需要申請手機讀寫的權限 AndroidMani.xml里面配置權限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 我們一般采用RxPe…

利用Signalr實現手機端App掃碼登錄web頁面

實現原理&#xff1a; 1、web登錄頁面&#xff0c;利用jquery.qrcode展示一個隨機生成的登錄碼的二維碼&#xff1b; 2、手機App掃描二維碼取得登錄碼&#xff1b; 3、手機App將本地用戶id登錄碼通過api提交服務器&#xff1b; 4、服務器api&#xff0c;收到手機App請求&am…

【ArcGIS風暴】ArcGIS柵格影像(NDVI)歸一化處理的兩種方法精解

【ArcGIS遇上Python】ArcGIS批量處理柵格影像(NDVI)歸一化完整案例代碼 圖像歸一化是指對圖像進行了一系列標準的處理變換,使之變換為一固定標準形式的過程,該標準圖像稱作歸一化圖像。 原始圖像在經歷一些處理或攻擊后可以得到多種副本圖像,這些圖像在經過相同參數的圖像…

[從C到C++] 1.3 C++布爾類型(bool)

布爾類型(bool)是C新增的一種基本數據類型。在標準的C語言中并未定義bool類型&#xff0c;如果需要使用bool類型&#xff0c;程序員可以通過宏定義來自定義一個bool類型&#xff0c;定義語句如下&#xff1a; #define bool int #define false 0 #define true 1 也就是將int型定…

以小見大:一個領域建模的簡單示例,理解“領域驅動”。

背景&#xff1a;航空公司為了確保飛行路線不發生沖突&#xff0c;需要開發一款飛行路線管理軟件。過程&#xff1a;我們先去找這個領域的專家&#xff0c;自然是作為平時管理和維護機場飛行秩序的工作人員&#xff1b;我們第一個目標就是與他們溝通&#xff0c;也許我們并不能…

hibernate -- hello world

http://developer.51cto.com/art/201202/315931_all.htm轉載于:https://www.cnblogs.com/iOS-mt/p/5973646.html

Android之底部Dialog里面放EditText點擊布局頂上去效果

1、需求 在底部Dialog里面放EditText點擊,布局需要頂上去,不頂上去很煩。 2、Dialog里面關鍵樣式屬性 <item name="android:windowFullscreen">false</item> 3、布局代碼簡單試下 樣式 <style name="DialogTheme" tools:ignore="…

SignalR ——Android實踐

SignalR 的版本&#xff1a;aspnetcore-2.2, Java SignalR-1.0.0 一、先說幾個點 1、我使用SignalR的時候服務器使用的是自簽名的HTTPS證書&#xff0c;所以OkHttp是無法直接解析的&#xff0c;會報錯。需要修改SignalR里面OkHttp部分的源碼&#xff0c;讓其信任所有的HTTPS連…

【ArcGIS遇上Python】ArcGIS批量處理柵格影像(NDVI)歸一化完整案例代碼

文章《ArcGIS柵格影像(NDVI)歸一化處理的兩種方法精解》詳細介紹了ArcGIS中進行NDVI影像歸一化處理的兩種方法,但是無法批量進行,本文就放大招用Python實現批量NDVI歸一化處理,大大提高了工作效率,還不趕快Get了? 完整Python代碼: import arcpy from arcpy import env…

Spark1.0.0 屬性配置

1&#xff1a;Spark1.0.0屬性配置方式Spark屬性提供了大部分應用程序的控制項&#xff0c;而且能夠單獨為每一個應用程序進行配置。在Spark1.0.0提供了3種方式的屬性配置&#xff1a;SparkConf方式 SparkConf方式能夠直接將屬性值傳遞到SparkContext&#xff1b;SparkConf能夠對…

Lync Server 2010遷移至Lync Server 2013部署系列 Part1: 擴展AD架構

由于最近直在忙Lync 升級&#xff0c;好久沒有更新博客了&#xff0c;今天開始將對最近做的Lync Server 2010遷移至Lync Server 2013項目做一個系列的部署操作更新&#xff0c;希望能給即將在企業中部署的兄弟們有所幫助&#xff0c;在這個測試環境中&#xff0c;企業 前端池共…

Android之BaseRecyclerViewAdpater(3.0.4版本)當頁面第二次滑到底部的時候沒有觸發OnLoadMoreListener監聽的onLoadMore函數

1 、問題 BaseRecyclerViewAdpater(3.0.4版本)當頁面第二次滑到底部的時候沒有觸發OnLoadMoreListener監聽的onLoadMore函數,也就是梅如下監聽的地方 adapter?.loadMoreModule?.setOnLoadMoreListener(object : OnLoadMoreListener {override fun onLoadMore() {Log.d(TAG,…

Hello Playwright:(7)模擬鍵盤和鼠標

盡管在上一節中&#xff0c;我們已經能夠通過FillAsync或ClickAsync來實現輸入和點擊元素。但是&#xff0c;還有其他場景&#xff0c;我們必須模擬用戶使用鍵盤、鼠標與頁面交互。例如在線文檔&#xff1a;Page.Keyboard 對象Keyboard提供用于管理虛擬鍵盤的 API&#xff0c;它…

精通Hibernate:通過Hibernate操縱對象

http://developer.51cto.com/art/201202/315954.htm轉載于:https://www.cnblogs.com/iOS-mt/p/5973683.html

【ArcGIS遇上Python】Python批量將多個文件夾下的多個影像數據鑲嵌至新柵格

ArcGIS雖然可以實現一次多個影像同時參與,拼接成一個整的影像,但是通常情況下,多個影像并不在同一個文件夾下,這樣拼接的時候需要逐個手動進行添加,如果數據量大的話,跟不就不可取,針對這一問題,本文采用Python,實現將多個文件夾下的多個影像拼接,高效快速。 我們以…

2019全球開發者調查:僅2%的人996,Python并不是最受喜愛的語言

導讀&#xff1a;開發者社區正在發生哪些變化&#xff1f;Stack Overflow 的最新調查獲得了一些預料之外的結果&#xff1a;Java 語言開發者的平均收入不到 35 萬元人民幣&#xff0c;成為了收入最低的群體&#xff1b;另一方面&#xff0c;人工智能領域流行的 Python 并不是最…

Java 編寫程序 創建一個游戲【5、6兩章的內容】【第5章】

每次使用單邊大腦的時間不要太久&#xff0c; 連續使用左邊腦30 分鐘如同使用左臂 30 分鐘一樣&#xff0c; 周期性性地交換讓大腦兩側輪流休息。 左腦活動包括了循序漸進的工作&#xff0c;解決邏輯問題與分析&#xff1b; 右腦的活動包括了陰雨、創造性思考、模式匹配與可視化…

一般地

2019獨角獸企業重金招聘Python工程師標準>>> 1.EO的Updatable屬性默認為Always&#xff0c;基于EO創建的VO也是。而基于SQL創建VO的Updatable屬性默認為Never&#xff0c;如果要修改&#xff08;例如將VO拖至頁面生成Form用于新增&#xff09;&#xff0c;則需將該屬…