摘要:現(xiàn)在,出現(xiàn)了更多本身支持或者通過插件支持語法智能提示糾錯(cuò)甚至是內(nèi)置編譯器的文本編輯器和。
TypeScript是什么
TypeScript是JavaScript的一個(gè)超集
TypeScript需要編譯為JavaScript才能運(yùn)行(語法糖)
TypeScript提供了類型系統(tǒng),規(guī)范類似Java
TypeScript提供了ES6的支持,也可以支持部分ES7草案的特性,不用擔(dān)心TypeScript無法兼容目前主流的JavaScript解釋器
環(huán)境安裝安裝node.js
https://nodejs.org/en/download/
安裝TypeScript包,這就是TS的編譯器
npm install -g typescript
檢查TypeScript是否安裝成功
tsc -v
TypeScript是開源的項(xiàng)目,由微軟開發(fā)和維護(hù),因此最初只有微軟的?Visual Studio?支持。現(xiàn)在,出現(xiàn)了更多本身支持或者通過插件支持 TypeScript 語法、智能提示、糾錯(cuò)、甚至是內(nèi)置編譯器的文本編輯器和IDE。
Visual Studio Code,微軟出品,內(nèi)置支持TypeScript特性
Sublime Text的官方插件
WebStorm的最新版本內(nèi)置支持
類型系統(tǒng) 原始數(shù)據(jù)類型主類型:
string、number、boolean
特殊類型:
null、undefined、symbol(ES6)
基礎(chǔ)類型聲明與使用:
string: let name: string = ‘Alice’; let desc: string = `my name is ${name}`; number: let norm: number = 666; let binaryNum: number = 0b111; let hexNum: number = 0xfff; let octalNum: number = 0o17; let nan: number = NaN; let infinity: number = Infinity; boolean: let yet: boolean = true; let flag: boolean = Boolean(0); null: let n: null = null; undefined: let u: undefined = undefined; symbol: let s: Symbol = Symbol(2); void: let v2: void = null; let v5: void = undefined;任意值類型
let name: string = ‘Tom’; name = 666; demo.ts(2,1): error TS2322: Type "666" is not assignable to type "string".
使用any類型: ``` let name: any = ‘Tom’; name = 666; ``` 隱式任意值類型: let name; name = ‘Tom’; name = 666; 等價(jià)于: let name : any; name = ‘Tom’; name = 666;類型推論
TS會(huì)在沒有明確指定類型的時(shí)候推測(cè)出一個(gè)類型,這就是類型推論
let user = ‘Tom’; user = 666; demo.ts(2,1): error TS2322: Type "666" is not assignable to type "string".聯(lián)合類型
TS中的聯(lián)合類型表示取值可為多種類型中的一種:
let user: string | number; user = 666; user = ‘Tom’;
訪問聯(lián)合類型的屬性或方法時(shí),只能訪問所有類型的共有方法:
function test(param: string|number){ return param.length; } demo.ts(2,18): error TS2339: Property "length" does not exist on type "string | number’.類型斷言
類型斷言可以手動(dòng)指定一個(gè)值的類型,但是類型斷言不是強(qiáng)制類型轉(zhuǎn)換,TypeScript編譯器不支持強(qiáng)制類型轉(zhuǎn)換。
function test(param: number|string){ if((對(duì)象的類型—接口param).length) return ( param).length; else return param.toString().length }
interface Sport { name: string, teamwork: boolean } let football: Sport = { name: "soccer", teamwork: true }
可選屬性:
interface Sport { name: string, teamwork: boolean, needPg?: boolean } let football: Sport = { name: "soccer", teamwork: true }
任意屬性:
interface Sport { name: string, teamwork: boolean, needPg?: boolean, [other: string]: any } let football: Sport = { name: "soccer", teamwork: true, needPg: true, count: 22 }
一旦定義任意屬性,那么確定屬性和可選屬性的類型必須是它的子屬性
只讀屬性:
interface Sport { readonly name: string, teamwork: boolean } let football: Sport = { name: "soccer", teamwork: true }函數(shù)的類型
函數(shù)聲明
function avg(x: number,y:number):number{ return (x+y)/2; }
函數(shù)表達(dá)式
let avg = function(x:number,y:number):number{ return (x+y)/2; }
or
let avg: (x:number,y:number) => number = function(x:number,y:number):number{ return (x+y)/2; }
函數(shù)可選參數(shù):
function avg(x: number,y?:number):number{ if(y){ return (x+y)/2; }else{ return x; } }
可選參數(shù)必須在必選參數(shù)的后面
函數(shù)的可選參數(shù)與默認(rèn)值:
function avg(y:number = 10,x: number):number{ if(y){ return (x+y)/2; }else{ return x; } }
TypeScript會(huì)將添加默認(rèn)值的參數(shù)識(shí)別為可選參數(shù),此時(shí)不受“可選參數(shù)必須在必選參數(shù)的后面”的限制
函數(shù)重載:
TypeScript中通過為一個(gè)函數(shù)進(jìn)行多次函數(shù)定義,并實(shí)現(xiàn)函數(shù)完成重載
function reverse(x: number): number; function reverse(x: string): string; function reverse(x: any):any{ if(typeof x == ‘number’){ return Number(x.toString().split(‘’).reverse().join(‘’)); }else{ return x.split(‘’).reverse().join(‘’); } }
面向?qū)ο蟮暮瘮?shù)重載:
interface A{ say(x:number); say(x:string); } class AA implements A{ say (x:any){ if(typeof x == ‘string’) console.log(‘string’,x); else console.log(‘number’,x); } } console.log((new AA()).say(1)); console.log((new AA()).say("123"));字符串字面量類型
該類型約束值只能是某幾個(gè)字符串的一個(gè),這是在編譯器層面做的約束,并不會(huì)改變生成的js代碼
type Name = "abc" | "def" | "mn"; function demo(e: Name): void{ console.log(e); } demo(‘a(chǎn)bc");TypeScript與面向?qū)ο?/b> 類
class Block { private hash: string; private prevHash: string; private nonce: number; constructor (hash: string, prevHash: string, nonce = 0){ this.hash = hash; this.prevHash = prevHash; this.nonce = nonce; } public get $hash(): string { return this.hash; } public set $hash(value: string) { this.hash = value; } public get $prevHash(): string { return this.prevHash; } public set $prevHash(value: string) { this.prevHash = value; } public get $nonce(): number { return this.nonce; } public set $nonce(value: number) { this.nonce = value; } public computeHash(){ let sha256 = crypto.createHash("sha256"); sha256.update(`${this.prevHash}${this.nonce.toString(16)}`,"utf8"); let hash = sha256.digest("hex"); return hash; } }抽象類
TypeScript中抽象類不允許被實(shí)例化
abstract class BtcBlock { public abstract computeHash(x:string):string; } class Block extends BtcBlock { public computeHash(x:string):string{ return `btc${x}`; }; }接口
上節(jié)已提到,TS中的接口就是抽象多個(gè)類的共有屬性與方法,作為對(duì)象的類型而存在
interface Alarm { alert(): void; } interface Light { lightOn(): void; lightOff(): void; } class Auto implements Alarm, Light { alert(){ console.log("car alart"); } lightOn(){ console.log("car light on"); } lightOff(){ console.log("car light off"); } }泛型
即在定義類、函數(shù)或接口時(shí)不指定具體類型,而在使用時(shí)指定類型的特性。
function useGeneric裝飾器(注解)(length: number,value: T):Array { let array: Array = []; for(let i=0;i (2,"hello world"); useGeneric (100,1);
裝飾器是特殊類型的聲明,可以被附加到類聲明、方法、訪問符、屬性或參數(shù)上,具體文檔:
https://www.tslang.cn/docs/ha...
裝飾器并未成為ES7的規(guī)范,因此未來可能會(huì)發(fā)生改變,并不推薦大家在線上項(xiàng)目中使用
裝飾器之方法裝飾器function enumerable(value: boolean) { return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { descriptor.enumerable = value; }; } class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } @enumerable(false) greet() { return "Hello, " + this.greeting; } }TypeScript與JavaScript生態(tài)
描述非TypeScript編寫的類庫的類型,需要聲明類庫所暴露出的API,類似于C的頭文件,在TypeScript中文件類型則為 .d.ts
使用TypeScript生態(tài)提供的聲明文件
npm install @types/node
聲明文件列表:
http://npm.vdian.net/browse/k...
自己編寫聲明文件
declare module “name”;
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/107727.html
摘要:前面我們已經(jīng)說了大部分的核心內(nèi)容,接下來我們就說說如何用開發(fā)實(shí)際項(xiàng)目。因?yàn)楹徒Y(jié)合很緊密,資料也很多,而且我會(huì)找機(jī)會(huì)專門說下這方面的知識(shí),所以我們將重點(diǎn)放到如何用結(jié)合上來。所以前面打牢基礎(chǔ),現(xiàn)在我們開始實(shí)際組建工作流。 前面我們已經(jīng)說了大部分typescript的核心內(nèi)容,接下來我們就說說如何用typescript開發(fā)實(shí)際項(xiàng)目。 因?yàn)閍ngular和typescript結(jié)合很緊密,資料也...
摘要:中文編程知乎專欄原文官方文檔起的這個(gè)噱頭名字雖然光看完文章就不止分鐘走完整個(gè)文檔流水賬如下代碼編輯器用的是源碼在第一個(gè)程序問好那誰吃了么那誰路人打醬油的問好路人運(yùn)行問好編譯生成問好文件添加參數(shù)類型問好那誰吃了么那誰如果那誰的類型不符比如中文編程知乎專欄原文 Typescript官方文檔起的這個(gè)噱頭名字: TypeScript in 5 minutes, 雖然光看完文章就不止5分鐘...走完整...
摘要:基本類型在中,提供了一下基本數(shù)據(jù)類型布爾類型數(shù)據(jù)類型字符串類型數(shù)組類型元組類型枚舉類型任意值類型和類型類型其中元組枚舉任意值類型和類型是有別與的特有類型。布爾類型布爾類型是最簡(jiǎn)單的數(shù)據(jù)類型,只有和兩種值。 學(xué)習(xí)Angular 2 , 《揭秘Angular 2》讀書筆記。Angular2 選擇 TypeScript 作為其官方最主要的構(gòu)建語音,這意味著掌握 TypeScript 語音將更...
摘要:周末是時(shí)隔兩月的家人團(tuán)聚,而每次內(nèi)容的準(zhǔn)備平均需要我集中精力工作小時(shí),所以第期的內(nèi)容今早才準(zhǔn)備好,對(duì)不住大家了。下面是本周精選內(nèi)容,請(qǐng)享用。本文作者王仕軍,商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 showImg(https://segmentfault.com/img/remote/1460000009742537?w=1240&h=509); 周末是時(shí)隔兩月的家人團(tuán)聚,而...
本文收集學(xué)習(xí)過程中使用到的資源。 持續(xù)更新中…… 項(xiàng)目地址 https://github.com/abc-club/f... 目錄 vue react react-native Weex typescript Taro nodejs 常用庫 css js es6 移動(dòng)端 微信公眾號(hào) 小程序 webpack GraphQL 性能與監(jiān)控 高質(zhì)文章 趨勢(shì) 動(dòng)效 數(shù)據(jù)結(jié)構(gòu)與算法 js core 代碼規(guī)范...
閱讀 976·2021-11-22 09:34
閱讀 2161·2021-11-11 16:54
閱讀 2195·2021-09-27 14:00
閱讀 940·2019-08-30 15:55
閱讀 1524·2019-08-29 12:46
閱讀 599·2019-08-26 18:42
閱讀 639·2019-08-26 13:31
閱讀 3183·2019-08-26 11:52