[typescript] hashMap and class practice

Published: by Creative Commons Licence

argument 없는 생성자 초기화

class Dict1 {
    constructor(private words: Words) { }
    /*
     타입스크립트가 자동으로 아래처럼 변환
     constructor(words) {
         this.words = words;
     }
     */
}

class Dict {
    private words: Words
    constructor() { // argument가 없어도 오류나지 않도록 방지, 수동 초기화
        this.words = {}
    }
}


const dict1 = new Dict1(); // argument가 없으므로 오류
const dict = new Dict1(); // OK

해시맵

키와 값의 형태인 해시맵은 아래처럼 정의할 수 있다.

type Words = {
    [key: string]: string // "potato": "food" 형태 = key이름은 모르지만 타입을 알고 있을 때 사용
}

클래스를 데이터타입으로 사용하기

add(word: Word)를 보면 Word클래스를 데이터타입으로 사용한 것을 알 수 있다.

type Words = {
    [key: string]: string
}

class Dict {
    private words: Words
    constructor() {
        this.words = {}
    }
    add(word: Word) {
       console.log(word)
    }
}
class Word {
    constructor(
        public term: string,
        public def: string
    ) { }
}

읽기 전용으로 만들기

프로퍼티 앞에 readonly를 붙여 주면 어디서든 접근은 할 수 있지만 수정은 불가능하다.

type Words = {
    [key: string]: string
}
class Word {
    constructor(
        public readonly term: string,
        public readonly def: string
    ) { }
}
const kimchi = new Word('kimchi', '한국의 음식');
kimchi.def = '세계의 음식' // error: Cannot assign to 'def' because it is a read-only property.

클래스 내에 메서드를 추가해서 테스트 해 보자

type Words = {
    [key: string]: string
}


class Dict {
    private words: Words
    constructor() {
        this.words = {}
    }
    add(word: Word) {
        if(this.words[word.term] === undefined) {
            this.words[word.term] = word.def
        }
    }
    def(term: string) {
        return this.words[term]
    }
    delete(term: string) {
        Object.keys(this.words).forEach(i => {
            if(i === term) {
                delete this.words[i]
            }
        })        
    }
    update(term: string, def: string) {
        if(this.words[term] !== undefined) {
            this.words[term] = def
        }
    }
}

class Word {
    constructor(
        public term: string,
        public def: string
    ) { }
}

const kimchi = new Word('kimchi', '한국의 음식');
const kim = new Word('kim','해산물')
const dict = new Dict()

dict.add(kimchi);
dict.add(kim)
dict.def(kimchi.term);
dict.update('kim', '해조류')
dict.delete('kim')