number: 數值類型,let num:number = 10;javascript
boolean:布爾值, let bl:boolean = false;java
string:字符型, let name:string = 'hello';數組
array:數組, let arr:number[] = [1,2,3]; let arr2:Array<number> = [1,2,3];ide
enum:枚舉, enum Color {Red, Green, Blue = 4};函數
any:任意, let notSure:any = "123"; let list:any[] = [1,"hello", false];this
void:函數返回空, function say():void {}spa
function add(x:number, y:number):number { return x + y; } var add2 = function (x:number, y:number):number { return x + y; } var add3 = (x:number, y:number) =>{ return x + y};
// 參數後面加 ?表示次參數可選 function func1(a: string, b?: string): string { b = b == undefined ? 'ts':b; return a + ' ' + b; } console.log(func1('hello')); // 默認參數 function func2(a: string, b: string = 'ts'): string { return a + ' ' + b; } console.log(func2('hello'));
function studentsName(firstName:string, ...restNames:string[]) { return firstName + ' '+ restNames.join(' '); } console.log(studentsName('aa', 'bb', 'cc', 'dd'));
// Lambads和this關鍵字 () => {}
function add(x:number):number { return 1; } function add(str:string, y:string):string { return "str"; }
// 類的建立 class Person{ name:string; age:number; // 構造函數 constructor(name:string, age:number){ this.name = name; this.age = age; } print(){ console.log(`${this.name} is ${this.age} years old`); } } // 實例化 let p = new Person('zhangshan', 20); p.print();
// 類的繼承 class Student extends Person{ school:string | undefined; } var s = new Student("lisi", 22); s.print()
// 訪問修飾符 /** * public: 公共的,外部、子類、內部均可以訪問 * protect:能夠在子類中訪問,外部不可訪問 * private: 私有的,只容許類內訪問 */
// 封裝的實現 class Hello { private _name:string = ""; get name():string{ return this._name; } set name(n:string){ this._name = n; } } var h = new Hello(); h.name = 'world'; console.log(h.name);
class Person{ static hello:string; } Person.hello = 'hello'; console.log(Person.hello);
// 建立接口 interface text{ label:string; } // 可選屬性 interface USB { name:string; version?:string;// 可選 } // 函數類型 interface SearchFunc { (source:string, subString:string):boolean; } var mySearch:SearchFunc = function (source:string, subString:string):boolean { let result = source.search(subString); return result != -1; } // 數組類型 interface ArrayStr { [index:number]:string; } let myArray:ArrayStr = ['zhangsan', 'lisi'];// 此數組只能爲string類型 // class 類型 interface ClockInterface { currTime:Date; setTime(d:Date):void; } class Clock implements ClockInterface { currTime: Date; constructor(d:Date) { this.currTime = d; } setTime(d: Date): void { this.currTime = d; } } // 接口繼承與混合類型, 能夠多繼承 interface Shape{ color:string; } interface PenStroke{ pen:number; } interface Square extends Shape, PenStroke{ side:number; } let s = <Square>{}; s.color = 'red'; s.side = 4; s.pen = 20; // 混合類型 interface Counter{ interval:number; reset():void; (start:number):string; }
// 泛型 function Hello<T>(arg:T):T { return arg; } console.log(Hello<number>(123)); console.log(Hello<string>('abc')); // 泛型的應用 interface Shape<T>{ name:T; } var s:Shape<number>; class HelloNumber <T> { name:T; constructor(n:T) { this.name = n; } } var hn = new HelloNumber<number>(10); var hs = new HelloNumber<string>('abc');
裝飾器:rest
裝飾器是一種特殊類型的聲明,它可以被附加到類聲明,方法,屬性或參數上,能夠修改類的行爲。 通俗的講裝飾器就是一個方法,能夠注入到類,方法,屬性參數上來擴展類、屬性、方法、參數的功能。 常見的裝飾器有:類裝飾器、屬性裝飾器、方法裝飾器、參數裝飾器 裝飾器的寫法:普通裝飾器(沒法傳參)、裝飾器工廠(可傳參) 裝飾器是過去幾年中js最大的成就之一,已經是ES7的標準特性之一。 執行順序:屬性 > 方法 > 方法參數 > 類,若是有多個相同的,它會先執行後面的
// 1.類裝飾器: function logClass(params:any) { // params 就是當前類HttpClient,能夠進行擴展 } @logClass class HttpClient { constructor(parameters:any) { } } // 2.類裝飾器:裝飾器工廠(可傳參) function logClass2(params:string) { return function (target:any) { // params:參數 // target:類對象 } } @logClass2("hello") class HttpClient2 { constructor(parameters: any) { } } // 3.方法裝飾器 function get(params:any) { return function (target:any, methodName:any, desc:any) { // target:類對象 // methodName:裝飾方法名 // desc:描述 } } class MethodClass{ constructor(){} @get('hello') getMethod(){ } }