<aside> 🔥 이번에는 리터럴, 유니온, 교차 타입 그리고 클래스에서 타입 선언에 대해 알아보았다.
</aside>
<aside> 🔥 (1) Literal Type
// const 는 상수이기 때문에 Chul 말고는 다른 값을 받을 수 없다.
const userName1 = "Chul";
// let은 언제든 값이 바뀔 수 있기 때문에 타입을 지정해줘야한다.
let userName2: string | number = "Tom";
(2) Union Types
// Union Types
// name "car", "mobile" 과같은 동일한 속성의 타입을 다르게해서 구분할 수 있는 것을 식별 가능한 union type이라고 한다.
interface Car {
name: "car"; // 타입 -> string이 아닌
color: string;
start(): void;
}
interface Mobile {
name: "mobile"; // 타입->string이 아닌 mobile
color: string;
call(): void;
}
function getGift(gift: Car | Mobile) {
console.log(gift.color);
if (gift.name === "car") {
gift.start(); // Mobile에 start()가 없다.
} else {
gift.call();
}
}
(3) 교차타입
여러 개의 타입을 하나로 합쳐주는 것
// Intersection Types
interface Car {
name: string;
start(): void;
}
interface Toy {
name: string;
color: string;
price: number;
}
const toyCar: Toy & Car = {
name: "타요",
start() {},
color: "blue",
price: 1000,
};
(4) 클래스에서 멤버변수
// (1) 아래처럼 미리 선언
class Car {
color: string; //미리 선언해줘야함.
constructor(color: string) {
this.color = color;
}
start() {
console.log("start");
}
}
const bmw = new Car("red");
// (2) public으로 선언
class Car {
constructor(public color: string) {
this.color = color;
}
start() {
console.log("start");
}
}
const bmw = new Car("red");
// (3) readonly로 선언
class Car {
constructor(readonly color: string) {
this.color = color;
}
start() {
console.log("start");
}
}
const bmw = new Car("red");
(5) 접근 제한자 (Access modifier) - public, private, protected
public : 자식클래스, 클래스 인스턴스 모두 접근 가능
// 이상 없음
class Car {
name: string = "car";
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("start");
console.log(this.name);
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name);
}
}
const z4 = new Bmw("black");
console.log(z4.name);
protected: 자식 클래스에서 접근 가능 (# 변수명으로 대체 가능)
class Car {
protected name: string = "car"; // protected
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("start");
console.log(this.name);
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name);
}
}
const z4 = new Bmw("black");
console.log(z4.name); // 클래스 인스턴스에서는 접근 불가
private : 해당 클래스 내부에서만 접근 가능
class Car {
private name: string = "car"; // private
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("start");
console.log(this.name);
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name); // 자식 클래스에서 접근 불가
}
}
const z4 = new Bmw("black");
console.log(z4.name); // 클래스 인스턴스에서는 접근 불가
(6) static
class Car {
name: string = "car";
color: string;
static wheels = 4; // static
constructor(color: string) {
this.color = color;
}
start() {
console.log("start");
console.log(this.name);
console.log(this.wheels); // 에러
console.log(Car.wheels); // 클래스명으로 써야함
}
}
class Bmw extends Car {
constructor(color: string) {
super(color);
}
showName() {
console.log(super.name); /
}
}
const z4 = new Bmw("black");
console.log(z4.name);
(7) 추상 class
// 추상 class
abstract class Car {
color: string;
constructor(color: string) {
this.color = color;
}
start() {
console.log("start");
}
// 추상
abstract doSomething(): void;
}
const car = new Car("red"); // 추상은 new 키워드로 생성 불가.
// 아래처럼 상속해서 써야함.
class Bmw extends Car {
constructor(color: string) {
super(color);
}
// 상속받은 곳에서 구체적으로 써야함.
doSomething() {
alert(3);
}
}
const z4 = new Bmw("black");
</aside>