전체 글

    type-alias

    interface User5{ name:string } interface Action5{ do():void } //타입 별칭 정하기 type UserAction = User5 & Action5 function createUserAction():UserAction{ return{ do(){}, name:'' } } type StringOrNumber = string | number type Arr = T[] type P = Promise type User2={ name:string } class UserImpl implements User2{ name="asdf" } type UserState = "PENDING" | "APPROVED" | "REJECTED" function checkUser(user:U..

    intersection/union

    interface User3{ name:string } interface Action{ do():void } //리턴값을 intersection으로 두개로 가능 function createUserAction2(u:User3,a:Action):User3 & Action{ return {...u,...a} } const u = createUserAction2({name:'jay'},{do(){}}) //union function compare(x:string|number,y:string|number){ if(typeof x==='number' && typeof y ==='number'){ return x===y?0: x>y ? 1 : -1 } if(typeof x==='string' && typeof y =..

    generic2

    //인터페이스도 제네릭 가능 interface DB{ add(v:T):void get():T } interface JSONSerialier{ serialize():string } //클레스도 제네릭 사용가능 //제네릭 구현하면 클라스도 제네릭 선언 필요 class LocalDB implements DB{ constructor(private localStorageKey:string){ } add(v:T){ localStorage.setItem(this.localStorageKey,v.serialize()) } get():T{ const v = localStorage.getItem(this.localStorageKey) return (v) ? JSON.parse(v) : null } } // interfac..

    generic

    function createPromise(x:T,timeout:number){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(x) },timeout) }) } //타입 안정해주면 알아서 생성 createPromise(1,100).then(v=>console.log(v)) createPromise("1",100).then(v=>console.log(v)) function createTuple2(v:T,v2:U):[T,U]{ return [v,v2] } const t1 = createTuple2("user1",1000)

    enum

    function createPromise(x:T,timeout:number){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(x) },timeout) }) } //타입 안정해주면 알아서 생성 createPromise(1,100).then(v=>console.log(v)) createPromise("1",100).then(v=>console.log(v)) function createTuple2(v:T,v2:U):[T,U]{ return [v,v2] } const t1 = createTuple2("user1",1000)