0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Angular/Typescript】クラスや型の使い方のサンプル

Posted at

コンポーネント以外の独自のクラスを作りたいときのメモ
サンプルを動かしてわかった気になりたい人向け

・AbstructClassと継承
・private/protectedの違い
・superの使い方
・リテラル型
・読み込み専用 readonly
…などのメモです。

例として
・動物クラス
・動物クラスを継承した分類クラス
・分類クラスを継承した種類クラス
を作っていきます

AnimalClass

abstract class Animal {
  //private name: string; //constructorの引数で宣言されていたらここに書き出してなくても変数として使える
  //protected canFly: boolean;
  protected color: string;
  protected type: "bird" | "dog" | "cat"; // リテラル型 指定した値以外は入力値にできない
  protected readonly xxx = 1;

  constructor(private name: string, protected canFly: boolean) {}

  setName(name: string) {
    this.name = name; // privateのフィールドは宣言されたクラスの中でなら書き込める
  }
  getParam() {
    return {
      name: this.name,
      color: this.color,
      canFly: this.canFly,
      type: this.type,
      xxx: this.xxx,
    };
  }
}

・abstractは継承して使ってもらうことを前提としたクラスだよ〜、
このクラスを直接使うことはできないよ〜ってこと。
・リテラル型を使うと、number型やstring型よりもより限定的な値を入力できるようにできる
上記の例だと、typeには"bird"または"dog"または"cat"の3つ以外の値が代入されたとき、エラーとなる
・privateは宣言したクラスでしか書き込み、読み込みができない。継承先で利用不可。

BirdClassとCrowClass

abstract class Bird extends Animal {
  constructor(name: string, canFly: boolean) {
    super(name, canFly); // Animalのコンストラクター
    super.type = "bird"; // protectedのフィールドは書き込める
    // super.name = name; // error privateのフィールドは書き込めない
    //super.setName(name); // privateのフィールドに書き込む用のメソッドなどを用意して書き込む
    // super.xxx = 2; // error readonlyは読み込みだけ可
  }
}

class Crow extends Bird {
  constructor() {
    super("crow", true);
    super.color = "black";
    //this.color = "black"; //superはthisでもいい
  }
}

Animalを継承した鳥クラス。そしてそれを継承した具体的な種類のカラスクラス。
・super は継承元のクラスを指す
・protectedで宣言されたフィールドはBirdやCrowクラスでも自由に使える。
・継承元のクラスで宣言されたフィールドを使うときはsuper.かthis.をつける
・privateのフィールドはBirdとCrowどちらからも直接書き込むことはできない
・書き込みたければsuperクラスに書き込むためのメソッドとか用意する必要がある
・readonlyのプロパティは、値を利用することはできるが、新たな値を代入はできない

RabbitClass

class Rabbit extends Animal {
  constructor(name: string, color: string) {
    super(name, false);
    //super.type = "rabbit"; // リテラル型で指定した以外の値なのでerror
    super.color = color;
  }
}

Animalクラスで動物の種類で指定できるのはbird,dog,catの三種類と指定したので
rabbitを代入しようとするとエラーになる

コンポーネント

import { Component, OnInit } from "@angular/core";

export class ClassTestComponent implements OnInit {
  //cat = new Animal(); // error abstractクラスは直接インスタンス化できない
  crow = new Crow();

  constructor() {}

  ngOnInit() {
    console.log(this.crow.getParam());
  }
}

・abstructのクラスはインスタンス化できない

スクリーンショット 2020-08-22 21.19.34.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?