1.JavaScript 的發展簡史圖:javascript
2.關於node與deno:html
(1)Node與Deno 的區別:Node 能夠工做,而 Deno 不行,Deno 只是一個原型或實驗性產品。前端
(2)Deno 的目標是不兼容 Node,而是兼容瀏覽器。Deno 不是要取代 Node.js,也不是下一代 Node.js,也不是要放棄 npm 重建 Node 生態。deno 的目前是要擁抱瀏覽器生態。java
(3)使用deno就 須要加載一個 TypeScript 編譯器node
其實TypeScript如今用的已經很普遍了,不管你使用ng、React仍是Vue均可以使用TypeScript來實現的你JavaScript代碼。程序員
3. TypeScript是什麼web
typeScript 是一種由微軟開發的自由和開源的編程語言。它是 JavaScript 的一個超集,TypeScript 在 JavaScript 的基礎上添加了可選的靜態類型和基於類的面向對象編程。其實TypeScript就是至關於JavaScript的加強版,可是最後運行時還要編譯成JavaScript。TypeScript最大的目的是讓程序員更具創造性,提升生產力,它將極大加強JavaScript編寫應用的開發和調試環節,讓JavaScript可以方便用於編寫大型應用和進行多人協做。正則表達式
4.TypeScript和JavaScript的對比typescript
ypeScript 與JavaScript二者的特性對比,主要表現爲如下幾點:npm
(1)TypeScript是一個應用程序級的JavaScript開發語言。(這也表示TypeScript比較牛逼,能夠開發大型應用,或者說更適合開發大型應用)
(2)TypeScript是JavaScript的超集,能夠編譯成純JavaScript。這個和咱們CSS離的Less或者Sass是很像的,咱們用更好的代碼編寫方式來進行編寫,最後仍是有好生成原生的JavaScript語言。
(3)TypeScript跨瀏覽器、跨操做系統、跨主機、且開源。因爲最後他編譯成了JavaScript因此只要能運行JS的地方,均可以運行咱們寫的程序,設置在node.js裏。
(4)TypeScript始於JavaScript,終於JavaScript。遵循JavaScript的語法和語義,因此對於咱們前端從業者來講,學習前來駕輕就熟,並無太大的難度。
(5)TypeScript能夠重用JavaScript代碼,調用流行的JavaScript庫。
(6)TypeScript提供了類、模塊和接口,更易於構建組件和維護。
安裝Node.js很是簡單,只要到Node官網下載一個最新版本就能夠了,相關安裝步驟參考連接:http://www.javashuo.com/article/p-mpdcimfc-hw.html
安裝好後,能夠打開命令行工具,同時按下win+R,而後輸入cmd就能夠打開,打開後輸入
node -v
npm -v
若是看到相關的版本號說明已經安裝成功了,看不到版本號就說明你的node.js沒有安裝成功。
在剛纔的命令行窗口繼續輸入以下命令:
npm install typescript -g
而後,輸入以下命令,查看相關版本號,正常顯示則說明包安裝成功。
tsc --version
1.初始化項目:進入你的編程文件夾後,可使用 npm init -y
來初始化項目,生成package.json文件。
2.建立tsconfig.json
文件,在終端中輸入tsc --init
:它是一個TypeScript
項目的配置文件,能夠經過讀取它來設置TypeScript
編譯器的編譯參數。
3.安裝@types/node,使用npm install @types/node --dev-save
進行安裝。這個主要是解決模塊的聲明文件問題。
4.編寫HelloWorld.ts
文件,而後進行保存,代碼以下。
var a:string = "HelloWorld" console.log(a)
5.使用webstorm 建立helloWorld.ts文件,詳細可參考 http://www.javashuo.com/article/p-tbuiagsc-z.html
6.在webstorm終端中輸入node helloWorld.js
就能夠看到結果了。
TypeScript
最大的一個特色就是變量是強類型的,也就是說,在聲明變量的時候,咱們必須給他一個類型。
TypeScript中的數據類型有:
(1)Undefined類型
在js中當你定義了一個變量,但沒有給他賦予任何值的時候,他就是Undefined類型。
咱們如今來看一個例子,好比咱們要聲明一個年齡的變量age
,咱們要使用數值類型,也就是Number
,可是咱們不給他任何的值,咱們只是在控制檯給它輸出,而後咱們來看結果。
新建demo01.ts文件,下入下面代碼:
//聲明數值類型的變量age,但不予賦值 var age:number console.log(age)
寫完後保存代碼,進行運行任務,而後生成demo01.js,在終端中使用node demo01.js
來進行查看運行結果。控制檯輸出了undefined
。
(2)Number類型
在TypeScript中,全部的數字都是Number類型,這不分是整數仍是小數。好比下面咱們聲明一個年齡是18歲,身高是178.5釐米。
新建一個文件demo01_1.ts文件,寫入下面代碼:
var age:number = 18 var stature:number = 178.5 console.log(age) console.log(stature)
而後執行轉換,查看結果,咱們能夠在控制檯看到結果已經順利輸出,沒有任何意外。
在TypeScrip中有幾種特殊的Number類型 咱們須要額外注意一下:
(3)string類型
由單引號或者雙引號括起來的一串字符就是字符串。好比:"demo",'121222'
var demo:string = "demo 12121" console.log(demo)
這時候控制圖就會輸出 demo 12121 。
(4)boolean布爾類型
布爾類型主要用於邏輯判斷,經過對與錯的判斷是最直觀的邏輯處理,boolean類型只有兩種值,true和false。
var b:boolean = true var c:boolean = false
(5)enum 類型
這個世界有不少值是多個而且是固定的,好比:
這種變量的結果是固定的幾個數據時,就是咱們使用枚舉類型的最好時機:
demo01_3.ts
enum REN{ nan , nv } console.log(REN.nan) //返回了0,這是索引index。
給這些枚舉賦值,能夠直接使用=
,來進行賦值。
enum REN{
nan = '男',
nv = '女',
}
console.log(REN.nan) //返回了男 這個字
(6)any類型
TypeScript友好的爲咱們提供了一種特殊的類型any
,好比咱們在程序中不斷變化着類型,又不想讓程序報錯,這時候就可使用any了。
var t:any =10 t = "wfaceboss" t = true console.log(t)
(7)Null類型
與 Undefined 相似,都表明空。Null 表明是引用類型爲空。
注意:剩餘的數組、元組、void 會在後續學到。
函數能夠理解爲:把功能相近的需求封裝成一個獨立的代碼塊,每次傳入不一樣的變量或參數,就能夠實現不一樣的結果。
1.定義函數
函數就至關於一個工具,若是你想使用這個工具,就要先製做這個工具。這就是咱們說的定義函數。在TypeScript裏定義函數跟JavaScript稍微有些不一樣。咱們來定義找姐姐的函數吧。
function searchXiaoJieJie(age:number):string{ return '找到了'+age+'歲的姐姐' } var age:number = 18 var result:string = searchXiaoJieJie(age) console.log(result) //找到了18歲的姐姐
上面的程序,先用function關鍵字聲明瞭一個searchXiaoJieJie
的方法,而後咱們使用了他,並返回了給咱們結果。
須要注意的是:
2.形參和實參
(1)形參的使用
函數定義的時候寫的參數是形參。從字面意義上咱們能夠看出,形參就是形式上的參數。咱們定義了形參也就規定了此函數的參數個數和參數類型,規範了函數。
function searchXiaoJieJie(age:number):string{ return '找到了'+age+'歲的姐姐' }
好比這個函數,就定義了一個形參,它的類型是數值類型。
(2)實參的使用
調用函數時傳遞的具體值就是實參。一樣從字面理解,實參就是真實的參數,咱們在使用的時候,具體真實傳遞過去的就是實參,好比18,20,22,這些具體的參數就是實參。
var age:number=18 var result:string = searchXiaoJieJie(age)
此時傳遞的age就是實參。
注意:
在函數調用的時候,咱們須要按照形參的規則傳遞實參,有幾個形參就要傳遞幾個實參,而且每個實參的類型要與對應的形參類型一致。
3. TypeScript語言中的函數參數
TypeScript的函數參數是比較靈活的,它不像那些早起出現的傳統語言那麼死板。在TypeScript語言中,函數的形參分爲:可選形參、默認形參、剩餘參數形參等。
(1)有可選參數的函數
可選參數,就是咱們定義形參的時候,能夠定義一個可傳可不傳的參數。這種參數,在定義函數的時候經過 ?
標註。
好比咱們繼續做找姐姐的函數,這回不只能夠傳遞年齡,還能夠選擇性的傳遞身材。咱們來看如何編寫。
function searchXiaoJieJie2(age:number,stature?:string):string{ let yy:string = '' yy = '找到了'+age+'歲' if(stature !=undefined){ yy = yy + stature } return yy+'的小姐姐' } var result:string = searchXiaoJieJie2(22,'大長腿') console.log(result) //找到了22歲大長腿的小姐姐
var result1=string=searchXiaoJieJie2(22)
console.log(result1)//找到了22歲的小姐姐
(2)有默認參數的函數
有默認參數就更好理解了,就是咱們不傳遞的時候,他會給咱們一個默認值,而不是undefined
了。咱們改造上邊的函數,也是兩個參數,可是咱們把年齡和身材都設置默認值。
function searchXiaoJieJie2(age:number=18,stature:string='大胸'):string{ let yy:string = '' yy = '找到了'+age+'歲' if(stature !=undefined){ yy = yy + stature } return yy+'的小姐姐' } var result:string = searchXiaoJieJie2() console.log(result)//找到了18歲大胸的小姐姐
(3)有剩餘參數的函數
有時候咱們有這樣的需求,我傳遞給函數的參數個數不肯定。
剩餘參數就是形參是一個數組,傳遞幾個實參過來均可以直接存在形參的數組中。
function searchXiaoJieJie3(...xuqiu:string[]):string{ let yy:string = '找到了' for (let i =0;i<xuqiu.length;i++){ yy = yy + xuqiu[i] if(i<xuqiu.length){ yy=yy+'、' } } yy=yy+'的小姐姐' return yy } var result:string = searchXiaoJieJie3('22歲','大長腿','瓜子臉','水蛇腰') console.log(result)//找到了22歲、大長腿、瓜子臉、水蛇腰、的小姐姐
1.函數聲明法
函數聲明法建立函數是最經常使用的函數定義法。使用function關鍵字和函數名去定義一個函數。
function add(n1:number,n2:number):number{ return n1+n2 }
2.函數表達式法
函數表達式法是將一個函數賦值給一個變量,這個變量名就是函數名。經過變量名就能夠調用函數了。這種方式定義的函數,必須在定義以後,調用函數。下面例子中等號右邊的函數沒有函數名,稱爲匿名函數。
var add = function(n1:number,n2:number):number{ return n1+n2 } console.log(add(1,4))
3.箭頭函數
箭頭函數是 ES6 中新增的函數定義的新方式,咱們的 TypeScript 語言是徹底支持 ES6 語法的。箭頭函數定義的函數通常都用於回調函數中。
var add = (n1:number,n2:number):number=>{ return n1+n2 } console.log(add(1,4))
第六節:函數中變量的做用域
定義在函數內部的變量與定義在函數外部的變量是不同的,做用的範圍也不同。
每一個變量都有一個起做用的範圍,這個範圍就是變量的做用域。在TypeScript語言中變量做用域劃分是以函數爲標準的。
1.函數做用域演示
咱們來舉個例子,如今要製做一個整形的方法,而後在函數裏用var
定義一個shape
的變量,咱們再函數的外部讀取這個變量,你會發現是讀取不到的。
function zhengXing():void{ var shape = '劉德華' console.log( shape) } zhengXing() console.log(shape)//報錯,shape is not defined
2.認識全局變量和局部變量
咱們改造上邊的程序,把shape
辦理移動到全局,而後再進行輸出。
var shape= '劉德華' function zhengXing():void{ console.log('你被整造成了'+shape+'的樣子') } zhengXing()//你被整成了劉德華的樣子 console.log(shape)//劉德華
這時候shape
變量是全局的,因此在函數內也能夠調用,在函數外也能夠調用。
3.局部變量和全局變量重名
當局部變量與全局變量重名的時候,在函數體內是局部變量起做用;若是重名,就有變量提高。
仍是上邊整形的例子,你是想整造成劉德華,可是函數體內部聲明瞭一個馬德華。雖然一字之差,可是樣子但是徹底不一樣的。咱們來看代碼如何實現:
var shape:string = '劉德華' function zhengXing():void{ var shape:string = '馬德華' console.log('你被整造成了'+shape+'的樣子') } zhengXing()//你被整造成了馬德華的樣子
console.log(shape)//劉德華
這回你會發現,你並無變成劉德華而是變成了馬德華。那你說我我想變成劉德華,我在函數沒聲明新變量前打印到控制檯行不行?
var shape:string = '劉德華' function zhengXing():void{ console.log('你整造成了'+shape+'的樣子') var shape:string = '馬德華' console.log('技術胖整造成了'+shape+'的樣子') } zhengXing() console.log(shape)
代碼改形成了這樣,可是你會發現,咱們輸出的結果以下:
你被整造成了undefined的樣子
產生這個結果的緣由就是變量提高,他的真實代碼是這樣的。
var shape:string = '劉德華' function zhengXing():void{ var yangzi:string console.log('技術胖整造成了'+shape+'的樣子') shape = '馬德華' console.log('技術胖整造成了'+shape+'的樣子') } zhengXing() console.log(shape)
也就是當內部聲明瞭和全局的變量同名時,就會出現變量提高的效果,聲明語句會提高到函數的第一句。這就是變量提高的含有。
4.let關鍵字變量的做用域
在早期javascript的變量做用域只有全局和局部,而且是以函數劃分的,但在其餘語言中,做用域的劃分是以一對大括號做爲界限的。
因此,JavaScript就遭到了無數開發者的吐槽,甚至說javascript不適合開發大型語言,容易內存溢出。JavaScript團隊意識到了這一點,在ES6中推出了let關鍵字。
使用let關鍵字的變量就是一個塊級做用域變量。實際工做中多使用let來聲明你的變量,讓程序更有條例。 來看一段程序:
function zhengXing():void{ var shape_a:string = '劉德華' { let shape_b:string = '小瀋陽' console.log('技術胖整造成了'+shape_b+'的樣子') } console.log('你被整造成了'+shape_a+'的樣子') console.log('你被整造成了'+shape_b+'的樣子') } zhengXing()
注意:這時候編譯後,咱們運行,你會發現是能夠執行的,而且打印到了控制檯正確的結果。 這是由於ts編譯成js,他自動給咱們加了ES5的處理,ES5裏是沒有let關鍵字的,如今咱們再改一下編譯好的程序,你會發現shape_b
這個關鍵字就找不到了。
TypeScript中的數據分爲值類型和引用類型。引用類型中封裝了不少對屬性,每一對屬性都有屬性名和屬性值。
在TypeScript中也給咱們提供了一些引用類型,例如:Array(數組)、String(字符串)、Date(日期對象)、RegExp(正則表達式)等
1.初始化數組的兩種方法
建立數組時能夠指定數組的容量,也能夠直接向數組中存儲數據。
聲明數組的方法
聲明數組跟聲明一個普通變量是同樣的,都是經過 var let 關鍵字實現的,只不過數組的類型說明符比較複雜而已。
let arr1:number[ ] //聲明一個數值類型的數組
let arr2:Array<string> //聲明一個字符串類型的數組
2.給數組賦值:
數組是存儲大量數據的集合,聲明數組以後,須要給數組存儲數據。這時候有兩種方法:
(1)字面量賦值法
//定義一個空數組,數組容量爲0 let arr1:number[] = [] //定義一個數組時,直接給數組賦值 let arr2:number[] = [1,2,3,4,5] //定義數組 的同事給數組賦值 let arr3:Array<string> = ['a','b','c'] let arr4:Array<boolean> = [ true,false,false]
須要注意的是,在TypeScript中指定數據類型的數組只能存儲同一類型的數組元素。
//報錯! 必須存儲number類型的數據 let arr5:number[] = [1,2,true]
(2)構造函數賦值法
在 TypeScript 中使用 Array 這個引用類型來表示數組的,那麼每個數組都是 Array 類型的實例。那麼,咱們在建立數組的時候也可使用構造函數來進行賦值。
let arr1:number[] = new Array() let ara2:number[] = new Array(1,2,3,4,5) let arr3:Array<string> = new Array('a','b','c') let arr4:Array<boolean> = new Array(true,false,false)
3.元組 ---特殊的數組
元組是一種特殊的數組,元組類型容許表示一個已知元素數量和類型的數組,各元素的類型沒必要相同。好比,你能夠定義一對值分別爲string和number類型的元組。
//聲明一個元祖類型 let x : [string,number] //正確的初始化 x = ['hello',10] //錯誤的初始化方法 x = [10,'hello']
在TypeScript中存在兩種類型的字符串:基本類型字符串和引用類型字符串。
(1)基本類型字符串:由單引號或者雙引號括起來的一串字符串。
(2)引用類型字符串:用new 實例化的 String類型。
引用類型的出現給字符串增長一系列方法了。以致於能夠更方便操做字符串。
須要說明的是這兩種聲明字符串的方法沒有什麼不一樣。基本類型的字符串能夠直接使用引用類型的屬性和方法。
相關的字符串學習參考:http://www.cnblogs.com/zengfp/p/9883073.html
TypeScript中使用Date這個引用類型來存儲日期對象,若是你要聲明一個日期變量時,記得也要註明它的類型是Date。
建立日期對象
日期對象是Date的實例,可使用構造函數的方法進行建立。而且構造函數中能夠傳遞多種類型的參數。
1.不傳遞任何參數
構造函數中不傳遞參數時,Date()構造函數將根據當前日期和時間建立一個Date對象。咱們看下面的例子理解一下。
let d:Date = new Date() console.log(d) //2018-12-01T02:51:24.770Z
傳遞一個整數,這個整數表明的是距離1970-01-01 00:00:00
的毫秒數。例如:傳入參數爲1000,將建立一個表示1970-01-01 00:00:01
的日期對象。
咱們舉個例子,傳遞一個整數,看一下結果。
let d:Date = new Date(1000) let da:Date = new Date(2000) console.log(d) //1970-01-01T00:00:01.000Z console.log(da) //1970-01-01T00:00:02.000Z
若是傳遞一個表示日期的字符串,就會生成相對應的日期對象。字符串的格式經常使用:yyyy/MM/dd hh:mm:ss
,yyyy-MM-dd hh:mm:ss
,yyyy-MM-ddThh:mm:ss
等,具體能夠參看下面的例子。
let d1:Date = new Date('2018/12/01 09:30:00') let d2:Date = new Date('2018-12-01 09:30:00') let d3:Date = new Date('2018-12-01T09:30:00') console.log(d1) console.log(d2) console.log(d3)
然,他們打印出來的結果時徹底相同的(都是2018-12-01T01:30:00.000Z),因此在開發中你不用太過於糾結使用哪一種方式進行聲明。
let d:Date = new Date(year,month,day,hours,minutes,seconds,ms);
用於驗證最好最強大的手段目前爲止就是正則表達式。TypeScript的RegExp類表示正則表達式。
建立正則表達式和字符串猶如一對好基友(相似),建立正則表達式也提供了兩種方法,一種是才採用new 關鍵字,另外一種是採用字面量的方式。
1.構造函數法
構造函數中能夠傳一個參數,也能夠傳遞兩個參數。一個是字符串描述,另外一個是修飾符,好比g是全局修飾符,i是忽略大小寫,m是多行模式。
let reg1:RegExp = new RegExp("baidu.com") //表示字符串規則裏含有abcefg console.log(reg1)// 結果爲 /baidu.com/
let reg2:RegExp = new RegExp("baidu.com",'gi') console.log(reg2) //結果爲 /baidu.com/gi
2.字面量法
簡而言之,直接寫正則表達式。
let reg3:RegExp = /baidu.com/
let reg4:RegExp = /baidu.com/gi
RegExp對象包含兩個方法:test( )和exec( ),功能基本類似,用於測試字符串匹配。
看一個例子:
let reg1:RegExp = /baidu/i let website:string = 'baidu.com.com' let result:boolean = reg1.test(website) console.log(result) //true
這時候控制檯打印出來的是true,那麼咱們再來看一下exec
的使用方法。
let reg1:RegExp = /baidu/i let website:string = 'baidu.com' console.log(reg1.exec(website)) //[ 'baidu', index: 0, input: 'baidu.com' ]
輸出的結果變爲了[ 'baidu', index: 0, input: 'baidu.com' ]
。
相關正則能夠查看一下這篇文章:http://www.runoob.com/regexp/regexp-tutorial.html
類的出現可讓前端程序員抽象層次、增長維護性和複用性。固然這一系列的類的操做,咱們都叫他面向對象編程。TypeScript就是一個基於類的面向對象編程語言。
類是對象具體事務的一個抽象,對象是類的具體表現。
認識TypeScript基於類的面向對象編程,就須要從一個簡單的類開始。
咱們模擬一個小姐姐的類,小姐姐須要有年齡,有姓名,會說「小哥哥好」。
看下面的例子:
class XiaoJieJie{ name:string; age:number; constructor(name:string,age:number){ this.name = name this.age = age } say(){ console.log('小哥哥好') } } let jiejie:XiaoJieJie = new XiaoJieJie('小紅',18) console.log(jiejie) jiejie.say()
咱們先用class關鍵字聲明瞭一個類,並在裏邊聲明瞭name
和age
屬性。constructor
爲構造函數。構造函數的主要做用是給類中封裝的屬性進行賦值。
TypeScript語言和Java還有C#很像(由於我只會這兩個面向對象的語言),類中屬性的訪問能夠用訪問修飾符來進行限制。訪問修飾符分爲:public、protected、private。
咱們仍是寫一個小姐姐的類,可是咱們使用一些訪問修飾符來修飾。
class XiaoJieJie2{ public sex:string protected name:string private age:number public constructor(sex:string,name:string,age:number){ this.sex=sex this.name=name this.age=age } public sayHello(){ console.log('小哥哥好') } protected sayLove(){ console.log('我愛你') } } var jiejie2:XiaoJieJie2 = new XiaoJieJie2('女','熱巴',22) console.log(jiejie2.sex) console.log(jiejie2.name) //報錯 console.log(jiejie2.age) //報錯 jiejie2.sayHello() jiejie2.sayLove()
使用readonly修飾符將屬性設置爲只讀,只讀屬性必須在生命時或者構造函數裏被初始化(注意)。
咱們聲明一個man的抽象類,裏邊只有一個屬性sex
,而且是隻讀。
class Man{ public readonly sex:string = '男' } var man:Man = new Man() man.sex='女'
在編輯器裏你就會發現報錯了,咱們就不強行編譯了。
繼承:容許咱們建立一個類(子類),從已有的類(父類)上繼承全部的屬性和方法,子類能夠新建父類中沒有的屬性和方法。
(1)先來建立一個父類。
class Jspang{ public name:string public age : number public skill: string constructor(name:string,age:number,skill:string){ this.name = name this.age = age this.skill = skill } public interest(){ console.log('玩') } } let jspangObj:Jspang = new Jspang('大頭爸爸',18,'web') jspangObj.interest()
做了一個的抽象類,有姓名,有年齡,有技能,而後還有一個函數是興趣。類建立好以後咱們就進行了實例化。
(2)繼承父類
class JsShuai extends Jspang{ public xingxiang:string = '帥氣' public zhuangQian(){ console.log('一天賺了一個億') } } let shuai = new JsShuai("小頭兒子",15,'領導力') shuai.interest() shuai.zhuangQian()
extends
關鍵字就是繼承的重點,是關鍵詞。TypeScript不支持多重繼承。
重寫就是在子類中重寫父類的方法。
好比:在子類中重寫父類中的interest方法。
class JsShuai extends Jspang{ public xingxiang:string = '帥氣' public interest(){ super.interest() console.log('創建電商平臺') } public zhuangQian(){ console.log('一天賺了一個億') } }
先是繼承了父類的方法,而後經過super關鍵字調用了父類的方法,實現了技能的增長。
在一般狀況下,接口是用來定義一些規範,使用這些接口,就必須實現按照接口中的規範來走。
定義接口的關鍵字是interface
。咱們如今就來定義一個接口,這個接口是用來規範丈夫的。
interface Husband { sex:string interest:string } let myhusband:Husband ={ sex:'男',interest:'看書、運動'} console.log(myhusband)
咱們經過接口,定義了一個找老公的接口,而且給他了兩個必選項:性別和興趣愛好.
對老公的標準若是咱們有一些可選項,這些並非都須要顯示出來的,在有些狀況下,咱們只須要傳入部分參數。咱們可使用問號?的形式來設置可選參數。
好比:如今咱們還但願老公的標準,有一條是給我「買包包」,可是這個是隱喻的,不是直接顯示出來的。咱們修改咱們的接口。
interface Husband { sex:string interest:string maiBaoBao?:Boolean } let myhusband:Husband ={ sex:'男',interest:'看書、運動',maiBaoBao:true} console.log(myhusband)
上面的代碼maiBaoBao
選項就是可選的,能夠寫也能夠不寫。
咱們還可使用接口來規範函數類型的接口,好比如今要找老公這件事,咱們規定有一些資源,而後咱們須要哪些資源,在函數中進行匹配,最後返回是否匹配成功。
interface SearchMan{ (source:string,subString:string):boolean } let mySearch:SearchMan
mySearch = function(source:string,subString:string):boolean{ let flag =source.search(subString) return (flag != -1) } console.log(mySearch('高、富、帥、德','胖')) //false
在製做大型應用的時候,爲了讓程序更加有層次感和變量之間不互相干擾,咱們可使用命名空間來構建程序。
舉個小例子:好比「德華」這件事,帥哥也有叫德華的,二師兄也有叫德華的。那咱們要如何區分呢?。
固然命名空間就是解決這個問題的,命名空間,又稱內部模塊,被用於組織有些具備內在聯繫的特性和對象。咱們來看一個例子:
namespace shuaiGe{ export class Dehua{ public name:string = '劉德華' talk(){ console.log('我是帥哥劉德華') } } } namespace bajie{ export class Dehua{ public name:string = '馬德華' talk(){ console.log('我是二師兄馬德華') } } } let dehua1:shuaiGe.Dehua = new shuaiGe.Dehua() let dehua2:shuaiGe.Dehua = new bajie.Dehua() dehua1.talk()
經過命名空間咱們很好的把程序變的清晰了。