TypeScript - Generic3

Seung min, Yoo·2021년 5월 7일
0
post-thumbnail
interface DB<T> {
  add(v: T): void;
  get(): T;
}

class D<T> implements DB<T> {
  add(v: T): void{
    throw new Error("Method not implemented.")
  }
  get(): T{
    throw new Error("Method not implemented.")
  }
}

class LocalDB<T> implements DB<T>{
  constructor(private localStorageKey: string) {
    add(v: T) {
    localStorage.setItem(this.localStorageKey, JSON.stringify(v));
  }
  get(): T {
    const v = localStorage.getItem(this.localStorageKey);
    return (v) ? JSON.parse(v) : null;
  }
 }
}

interface User { name: string }

const userDb = new LocalDB<User>('user');
userDb.add({ name: 'jay' });
const userA = userDb.get(); 
userA.name;

generic은 마찬가지로 클래스 뿐만 아니라 인터페이스에서도 사용할 수 있다.

Type파라미터에 있는 type의 범위를 특정한 타입의 하이타입으로 고정할 수 있다.

interfcae JSONSerialier {
  serialize(): string;
}

class LocalDB<T extends JSONSerialier> implements DB<T> {
   constructor(private localStorageKey: string) {
     add(v: T) {
       v.serialize();// 여기서 v로 serialize를 쓸 수 있는 것이다.
    localStorage.setItem(this.localStorageKey, JSON.stringify(v));
  }
  get(): T {
    const v = localStorage.getItem(this.localStorageKey);
    return (v) ? JSON.parse(v) : null;
  }
 }
}

조건부 타입

interface Vegitable {
  v: string;
}
interface Meat {
  m: string;
}

interface Cart<T> {
  getItem(): T extends Vegitable ? Vegitable : Meat 
}

const cart2: cart<Vegitable> = {
  getItem() {
    return {
      v: ''
    }
  }
}

cart2.getItem()
profile
이제 막 개발을 시작한 프로그래밍 입문자

0개의 댓글