1.TypeScript-Basic
2.TypeScript interface
3.Typescript-module(1)
4.TypeScript Modules(2)
5.Typescript tsconfig
6.TypeScript Functions
7.Typescript Classjavascript
class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } greet() { return "Hello, " + this.greeting; } } let greeter = new Greeter("world");
對於這個demo的理解怎麼說呢?java
若是你是java或C#程序員,你應該這樣理解:程序員
public class Greeter{ public String greeting; public Greeter(String message){ this.greeting = message; } public string greet(){ return "Hello, " + this.greeting; } }
若是你是javascript程序員,那你應該這樣理解typescript
function Greeter(message){ this.greeting = message; } Greeter.prototype.greet = function(){ return "Hello, " + this.greeting; }
對於上個例子,有一種簡寫方法segmentfault
class Animal { constructor(private name: string) { } move(distanceInMeters: number) { console.log(`${this.name} moved ${distanceInMeters}m.`); } }
僅在構造函數裏使用private name: string參數來建立和初始化name成員。 咱們把聲明和賦值合併至一處。函數
參數屬性經過給構造函數參數添加一個訪問限定符來聲明。 使用private限定一個參數屬性會聲明並初始化一個私有成員;對於public和protected來講也是同樣。this
class Animal { name:string; constructor(theName: string) { this.name = theName; } move(distanceInMeters: number = 0) { console.log(`${this.name} moved ${distanceInMeters}m.`); } } class Snake extends Animal { constructor(name: string) { super(name); } move(distanceInMeters = 5) { console.log("Slithering..."); super.move(distanceInMeters); } } class Horse extends Animal { constructor(name: string) { super(name); } move(distanceInMeters = 45) { console.log("Galloping..."); super.move(distanceInMeters); } } let sam = new Snake("Sammy the Python"); let tom: Animal = new Horse("Tommy the Palomino"); sam.move(); tom.move(34);
這個代碼的理解呢?java程序員應該很好理解吧,子類重寫了父類方法move,而後父類引用指向子類對象,多態實現了!prototype
重點是javascript如何理解呢?code
本質是javascript的原型繼承,若是你想了解javascript繼承高仿對象
OOP,我這裏有一篇文章javascript繼承
想必是java同窗前面一直有的疑問吧?
首先記住默認共有
第一個例子我但是所有加了public關鍵字的哦
class Animal { private name: string; constructor(theName: string) { this.name = theName; } } new Animal("Cat").name; // Error: 'name' is private;
protected修飾符與private修飾符的行爲很類似,但有一點不一樣,protected成員在派生類中仍然能夠訪問。例如:
class Person { protected name: string; constructor(name: string) { this.name = name; } } class Employee extends Person { private department: string; constructor(name: string, department: string) { super(name) this.department = department; } public getElevatorPitch() { return `Hello, my name is ${this.name} and I work in ${this.department}.`; } } let howard = new Employee("Howard", "Sales"); console.log(howard.getElevatorPitch()); console.log(howard.name); // error
構造函數也可被標記爲protected. 這就是說這個類不能在包含它的類以外實例外,可是能夠被繼承。好比,
class Person { protected name: string; protected constructor(theName: string) { this.name = theName; } } // Employee can extend Person class Employee extends Person { private department: string; constructor(name: string, department: string) { super(name); this.department = department; } public getElevatorPitch() { return `Hello, my name is ${this.name} and I work in ${this.department}.`; } } let howard = new Employee("Howard", "Sales"); let john = new Person("John"); // Error: The 'Person' constructor is protected
想什麼,對抽象類
class Employee { private _fullName: string; get fullName(): string { return this._fullName; } set fullName(newName: string) { if (passcode && passcode == "secret passcode") { this._fullName = newName; } else { console.log("Error: Unauthorized update of employee!"); } } } let employee = new Employee(); employee.fullName = "Bob Smith"; if (employee.fullName) { alert(employee.fullName); }
和C#很像
使用很簡單的,屬性前加static關鍵字
class Grid { static origin = {x: 0, y: 0}; calculateDistanceFromOrigin(point: {x: number; y: number;}) { let xDist = (point.x - Grid.origin.x); let yDist = (point.y - Grid.origin.y); return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale; } constructor (public scale: number) { } } let grid1 = new Grid(1.0); // 1x scale let grid2 = new Grid(5.0); // 5x scale console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10})); console.log(grid2.calculateDistanceFromOrigin({x: 10, y: 10})); console.log(Grid.origin);
abstract class Animal { abstract makeSound(): void; move(): void { console.log('roaming the earch...'); } }
class Greeter { greeting: string; constructor(message: string) { this.greeting = message; } greet() { return "Hello, " + this.greeting; } } var greeter: Greeter; greeter = new Greeter("world"); alert(greeter.greet());
greeter的類型是Greeter, Greeter的類型是typeof Greeter
class Greeter { static standardGreeting = "Hello, there"; greeting: string; greet() { if (this.greeting) { return "Hello, " + this.greeting; } else { return Greeter.standardGreeting; } } } var greeter1: Greeter; greeter1 = new Greeter(); alert(greeter1.greet()); var greeterMaker: typeof Greeter = Greeter; greeterMaker.standardGreeting = "Hey there!"; var greeter2:Greeter = new greeterMaker(); alert(greeter2.greet());
這個語法不經常使用,據我所知只在動態加載中有用
抽象方法的語法與接口方法類似:定義方法簽名不包含方法體
區別:抽象類:抽象方法必須使用abstract關鍵字而且能夠包含訪問符