摘要:現在,出現了更多本身支持或者通過插件支持語法智能提示糾錯甚至是內置編譯器的文本編輯器和。
TypeScript是什么
TypeScript是JavaScript的一個超集
TypeScript需要編譯為JavaScript才能運行(語法糖)
TypeScript提供了類型系統,規范類似Java
TypeScript提供了ES6的支持,也可以支持部分ES7草案的特性,不用擔心TypeScript無法兼容目前主流的JavaScript解釋器
環境安裝安裝node.js
https://nodejs.org/en/download/
安裝TypeScript包,這就是TS的編譯器
npm install -g typescript
檢查TypeScript是否安裝成功
tsc -v
TypeScript是開源的項目,由微軟開發和維護,因此最初只有微軟的?Visual Studio?支持。現在,出現了更多本身支持或者通過插件支持 TypeScript 語法、智能提示、糾錯、甚至是內置編譯器的文本編輯器和IDE。
Visual Studio Code,微軟出品,內置支持TypeScript特性
Sublime Text的官方插件
WebStorm的最新版本內置支持
類型系統 原始數據類型主類型:
string、number、boolean
特殊類型:
null、undefined、symbol(ES6)
基礎類型聲明與使用:
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; 等價于: let name : any; name = ‘Tom’; name = 666;類型推論
TS會在沒有明確指定類型的時候推測出一個類型,這就是類型推論
let user = ‘Tom’; user = 666; demo.ts(2,1): error TS2322: Type "666" is not assignable to type "string".聯合類型
TS中的聯合類型表示取值可為多種類型中的一種:
let user: string | number; user = 666; user = ‘Tom’;
訪問聯合類型的屬性或方法時,只能訪問所有類型的共有方法:
function test(param: string|number){ return param.length; } demo.ts(2,18): error TS2339: Property "length" does not exist on type "string | number’.類型斷言
類型斷言可以手動指定一個值的類型,但是類型斷言不是強制類型轉換,TypeScript編譯器不支持強制類型轉換。
function test(param: number|string){ if((對象的類型—接口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 }函數的類型
函數聲明
function avg(x: number,y:number):number{ return (x+y)/2; }
函數表達式
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; }
函數可選參數:
function avg(x: number,y?:number):number{ if(y){ return (x+y)/2; }else{ return x; } }
可選參數必須在必選參數的后面
函數的可選參數與默認值:
function avg(y:number = 10,x: number):number{ if(y){ return (x+y)/2; }else{ return x; } }
TypeScript會將添加默認值的參數識別為可選參數,此時不受“可選參數必須在必選參數的后面”的限制
函數重載:
TypeScript中通過為一個函數進行多次函數定義,并實現函數完成重載
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(‘’); } }
面向對象的函數重載:
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"));字符串字面量類型
該類型約束值只能是某幾個字符串的一個,這是在編譯器層面做的約束,并不會改變生成的js代碼
type Name = "abc" | "def" | "mn"; function demo(e: Name): void{ console.log(e); } demo(‘abc");TypeScript與面向對象 類
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中抽象類不允許被實例化
abstract class BtcBlock { public abstract computeHash(x:string):string; } class Block extends BtcBlock { public computeHash(x:string):string{ return `btc${x}`; }; }接口
上節已提到,TS中的接口就是抽象多個類的共有屬性與方法,作為對象的類型而存在
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"); } }泛型
即在定義類、函數或接口時不指定具體類型,而在使用時指定類型的特性。
function useGeneric裝飾器(注解)(length: number,value: T):Array { let array: Array = []; for(let i=0;i (2,"hello world"); useGeneric (100,1);
裝飾器是特殊類型的聲明,可以被附加到類聲明、方法、訪問符、屬性或參數上,具體文檔:
https://www.tslang.cn/docs/ha...
裝飾器并未成為ES7的規范,因此未來可能會發生改變,并不推薦大家在線上項目中使用
裝飾器之方法裝飾器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生態
描述非TypeScript編寫的類庫的類型,需要聲明類庫所暴露出的API,類似于C的頭文件,在TypeScript中文件類型則為 .d.ts
使用TypeScript生態提供的聲明文件
npm install @types/node
聲明文件列表:
http://npm.vdian.net/browse/k...
自己編寫聲明文件
declare module “name”;
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107727.html
摘要:前面我們已經說了大部分的核心內容,接下來我們就說說如何用開發實際項目。因為和結合很緊密,資料也很多,而且我會找機會專門說下這方面的知識,所以我們將重點放到如何用結合上來。所以前面打牢基礎,現在我們開始實際組建工作流。 前面我們已經說了大部分typescript的核心內容,接下來我們就說說如何用typescript開發實際項目。 因為angular和typescript結合很緊密,資料也...
摘要:中文編程知乎專欄原文官方文檔起的這個噱頭名字雖然光看完文章就不止分鐘走完整個文檔流水賬如下代碼編輯器用的是源碼在第一個程序問好那誰吃了么那誰路人打醬油的問好路人運行問好編譯生成問好文件添加參數類型問好那誰吃了么那誰如果那誰的類型不符比如中文編程知乎專欄原文 Typescript官方文檔起的這個噱頭名字: TypeScript in 5 minutes, 雖然光看完文章就不止5分鐘...走完整...
摘要:基本類型在中,提供了一下基本數據類型布爾類型數據類型字符串類型數組類型元組類型枚舉類型任意值類型和類型類型其中元組枚舉任意值類型和類型是有別與的特有類型。布爾類型布爾類型是最簡單的數據類型,只有和兩種值。 學習Angular 2 , 《揭秘Angular 2》讀書筆記。Angular2 選擇 TypeScript 作為其官方最主要的構建語音,這意味著掌握 TypeScript 語音將更...
摘要:周末是時隔兩月的家人團聚,而每次內容的準備平均需要我集中精力工作小時,所以第期的內容今早才準備好,對不住大家了。下面是本周精選內容,請享用。本文作者王仕軍,商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 showImg(https://segmentfault.com/img/remote/1460000009742537?w=1240&h=509); 周末是時隔兩月的家人團聚,而...
本文收集學習過程中使用到的資源。 持續更新中…… 項目地址 https://github.com/abc-club/f... 目錄 vue react react-native Weex typescript Taro nodejs 常用庫 css js es6 移動端 微信公眾號 小程序 webpack GraphQL 性能與監控 高質文章 趨勢 動效 數據結構與算法 js core 代碼規范...
閱讀 981·2021-11-22 09:34
閱讀 2165·2021-11-11 16:54
閱讀 2201·2021-09-27 14:00
閱讀 946·2019-08-30 15:55
閱讀 1533·2019-08-29 12:46
閱讀 604·2019-08-26 18:42
閱讀 644·2019-08-26 13:31
閱讀 3189·2019-08-26 11:52