TypeScriptクラス

クラス

class Person {
    // プロパティ
    protected name:string = '名無し'; // サブクラスからもアクセスできるが変更できない
    private mail?:string; // サブクラスからもアクセスできない
    public age?:number; // どこからでもアクセスできる(publicをつけないとこれ)

    // 初期処理
    constructor(name:string, mail:string = 'no-mail', age:number = -1){
        this.name = name;
        this.mail = mail;
        this.age = age;

    }

    // メソッド
    print():void{
        console.log(this.name + '(' + this.mail + ','+this.age + ')');
    }
}

enum School {
    junior = 'junior',
    juniorHigh = 'juniorHigh',
    high = 'high',
    other = 'other'
}
class Strudent extends Person {
    school?:School
    private _grade_num:number = -1;

    get grade_num():number{
        return this._grade_num;
    }
    private set grade_num(val:number){
        this._grade_num = val;
    }
    get grade():string{
        return this._grade_num + ({
            1:'st',
            2:'nd',
            3:'rd'
        }[this._grade_num] || 'th');
    }

    constructor(name:string,school:School,grade:number){
        // スーパークラスのコンストラクタを呼ぶ
        super(name);
        
        this.school = school;
        this.grade_num = grade;
        switch(school){
            case School.junior:
                this.age = 6 + this.grade_num;
                break;
            case School.juniorHigh:
                this.age = 12 + this.grade_num;
                break;
            case School.high:
                this.age = 15 + this.grade_num;
                break;
            default:
                this.age = -1;

        }

    }

    // メソッドオーバーライド
    print():void{
        console.log(this.name + '(' + this.school + ':'+ (this.grade || '-') + ')');
    }
}


const taro = new Person('taro','aaa@aaa.com',39);
taro.print();

const hanako = new Strudent('hanako',School.high,2);
hanako.print();

インターフェース

クラスに指定することで使う。
インターフェースに用意されたものは必ず使うことになる。

// interface は基本public
interface input{
    value:string|number,
    placeholder?:string|number,
}
class Input implements input{
    value:string|number;
    placeholder:string|number;

    constructor(value:string|number, placeholder:string|number = ''){
        // 継承関係はないのでsuperは不要
        this.value = value;
        this.placeholder = placeholder;
    }

    showLog():void{
        console.log(this.value,this.placeholder);
    }
}

class Radio implements input{
    value:string|number;
    list:string[]|number[];

    constructor(value:string|number, list:string[]|number[]){
        this.value = value;
        this.list = list;
    }
    showLog():void{
        console.log(this.value,this.list);
    }
}

インターフェース自体も継承もできる

interface People extends Human {
    birth:Date
}

抽象クラス

他の何かのクラスを継承するなら使えない
protect メソッドがいるなら抽象クラス

abstract class 抽象クラス名{
    abstract 抽象メソッド():型
}
class サブクラス extends 抽象クラス名{
    constructor(){
        super()
    }
    抽象クラス名():型{
    }
}

静的メンバー

インスタンスを生成する必要がないときはそのまま使える。
その場合はメンバーやメソッドは静的で宣言。

static プロパティ:型
static メソッド(引数):型

パラメータプロパティ

総称型クラス