Typescript Class

6789 ワード

TypeScript-Class


typescriptの旅


1.TypeScript-Basic 2.TypeScript interface 3.Typescript-module(1) 4.TypeScript Modules(2) 5.Typescript tsconfig 6.TypeScript Functions 7.Typescript Class

Class

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

let greeter = new Greeter("world");
  • このdemoの理解についてどう言いますか.
  • javaまたはC#プログラマーであれば、
  • と理解する必要があります.
    public class Greeter{
        public String greeting;
        public Greeter(String message){
            this.greeting = message;
        }
        public string greet(){
            return "Hello, " + this.greeting;
        }
    }
  • javascriptプログラマーであれば、
  • をこのように理解する必要があります.
    function Greeter(message){
        this.greeting = message;
    }
    Greeter.prototype.greet = function(){
        return "Hello, " + this.greeting;
    }

    パラメータのプロパティ

  • 前の例については、簡略化方法
  • がある.
    class Animal {
        constructor(private name: string) { }
        move(distanceInMeters: number) {
            console.log(`${this.name} moved ${distanceInMeters}m.`);
        }
    }
  • は、構造関数でprivate name:stringパラメータのみを使用してnameメンバーを作成および初期化します.私たちは声明と賦値を1つに統合します.
  • パラメータ属性は、コンストラクション関数パラメータにアクセス制限子を追加することによって宣言される.privateを使用してパラメータ属性を限定すると、プライベートメンバーが宣言され、初期化されます.publicやprotectedにとっても同じです.

  • 継承

    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を書き換え、親リファレンスは子オブジェクトを指し、マルチステートが実現しました.
  • javascriptはどのように理解するかに重点を置いています.

  • 本質はjavascriptのプロトタイプ継承であり、javascript継承の高模倣を理解したい場合は
    OOP、ここにjavascriptの継承記事があります.

    パブリック、プライベート、保護された修飾子

  • javaさんの前でずっと疑問に思っていたのではないでしょうか.

  • まずデフォルトの最初の例を覚えておいてください.私はすべてpublicキーワードを追加しました.

    privateの理解

    class Animal {
        private name: string;
        constructor(theName: string) { this.name = theName; }
    }
    
    new Animal("Cat").name; // Error: 'name' is private;

    protectedの理解

  • 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
    
  • 何を考えているのか、抽象類
  • Get/Set

    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キーワードを使用する必要があり、アクセス記号
  • を含めることができる.