readonly properties

readonly : 초기화 되는 영역에서만 할당할 수 있음(수정 방지)

class Person {

  public readonly name: string = "Anna";

  public constructor(private _name: string, private age: number) {}

}

const p1: Person = new Person("Mark", 39);
console.log(p1.name); // undefined
p1.name = "Anna"; 
// 읽기 전용 속성이므로 'name'에 할당할 수 없습니다.ts(2540)
console.log(p1.name); // undefined
class Person {

  public readonly name: string = "Anna";
  private readonly country: string = "Korea";

  public constructor(private _name: string, private age: number) {}

  hello() {
    this.country = "Canada";
    // 읽기 전용 속성이므로 'country'에 할당할 수 없습니다.ts(2540)
  }

}
class Person {

  public readonly name: string = "Anna";
  private readonly country: string;

  public constructor(private _name: string, private age: number) {
    this.country = "Korea";
  }

  hello() {
    this.country = "Canada";
    // 읽기 전용 속성이므로 'country'에 할당할 수 없습니다.ts(2540)
  }

}

Index Signatures in class

// class => obejct
// {Anna: "female", Jane: "female"}
// {Jason: "male", Alex: "male", Choi: "female"}
// 클래스 동적 처리

class Students {
  // [index: string]: string;
  [index: string]: "male" | "female"; // 정확한 값 할당
}

const a = new Students();
a.Anna = "female";
a.Jane = "female";

console.log(a); // Students { Anna: 'female', Jane: 'female' }

const b = new Students();
b.Jason = "male";
b.Alex = "male";
b.Choi = "female";

console.log(b); // Students { Jason: 'male', Alex: 'male', Choi: 'female' }
class Students {
  // [index: string]: string;
  [index: string]: "male" | "female"; // 정확한 값 할당

  Anna: "female" = 'female';
  Anna = 'female';
  // 'Anna' 형식의 'string' 속성을 'string' 인덱스 유형 '"female" | "male"'에 할당할 수 없습니다.ts(2411)
}

Static Properties & Methods

class Person {
  public hello() {
    console.log('안녕하세요');
  }
}

const p1 = new Person();
p1.hello();

Person.hello();
// 'typeof Person' 형식에 'hello' 속성이 없습니다.ts(2339)
class Person {
  public static hello() {
    console.log('안녕하세요');
  }
}

const p1 = new Person();
p1.hello();
// 'hello' 속성이 'Person' 형식에 없습니다. 대신 정적 멤버 'Person.hello'에 액세스하려고 하셨습니까?ts(2576)

Person.hello();
class Person {
  private static CITY = 'Seoul';
  public static hello() {
    console.log('안녕하세요', Person.CITY);
  }
}

const p1 = new Person();
// p1.hello();

Person.hello();
class Person {
  private static CITY = 'Seoul';
  public hello() {
    console.log('안녕하세요', Person.CITY);
  }

  public change() {
    Person.CITY = "LA";
  }
}

const p1 = new Person();
p1.hello();

const p2 = new Person();
p2.hello();
p1.change();
p2.hello();

Singletons

class ClassName {

  private static instance: ClassName | null = null;

  public static getInstance(): ClassName {
    // ClassName 으로 만든 object 가 있으면 return
    // ClassName 으로 만든 object 가 없으면 만들어서 return
    if(ClassName.instance === null) {
      ClassName.instance = new ClassName();
    }

    return ClassName.instance;
  }

  private constructor() {}
}

const a = ClassName.getInstance();
const b = ClassName.getInstance();

console.log(a === b); // true

상속(inheritance)

class Parent {
  constructor(protected _name: string, private _age: number) {}

  public print(): void {
    console.log(`이름은 ${this._name}이고, 나이는 ${this._age}입니다.`);
  }
}

const p = new Parent("Mark", 39);
p.print(); // 이름은 Mark이고, 나이는 39입니다.
class Parent {
  constructor(protected _name: string, private _age: number) {}

  public print(): void {
    console.log(`이름은 ${this._name}이고, 나이는 ${this._age}입니다.`);
  }

  protected printName(): void {
    console.log(this._name, this._age);
  }
}

// const p = new Parent("Mark", 39);
// p.print(); // 이름은 Mark이고, 나이는 39입니다.

class Child extends Parent {

  public gender = "male";

  constructor(age: number) {
    super("Jane", age);
    this.printName();
  }
}

const c = new Child(1);
c.print();

Abstract Classes

abstract class AbstractPerson {
  protected _name: string = "Mark";

  abstract setName(name: string): void;
}

// new AbstractPerson(); // Error!

class Person extends AbstractPerson {
  setName(name: string): void {
    this._name = name;
  }
}

const p = new Person();
// p.setName(); // Error!
profile
성장하는 개발자 유슬이 입니다!

0개의 댓글