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()