key in, in, keyof mapping으로 타입스크립트 타입 선언

YOUNGJOO-YOON·2022년 2월 21일
0

typeScript

목록 보기
56/65
post-custom-banner
type WeekDay = 'Mon'|'Tue'|'Wed'|'Thu'|'Fri';
type Day = WeekDay|'Sat' |'Sun';
// type Record<K extends keyof any,T>={
//     [P in K]:T
// }
const day:Record<WeekDay,Day> = {
    Fri:'Fri',
    Mon:'Mon',
    Thu:'Thu',
    Wed:'Wed',
    Tue:'Tue'
}

type Account = {
    id:number;
    isEmploy:boolean;
    notes:string[];
}

type ReadonlyAccount = {
    readonly [K in keyof Account]:Account[K];
}
type ReadonlyAccount2 = {
    -readonly [K in keyof Account]:Account[K];
}

type OptionalAccount = {
    [K in keyof Account]:Account[K]
}


type ABC = 'A'|'B'|'C';
type In = {[K in ABC]:K}

const abc0:In = {
    A:"A",
    B:"B",
    C:"C"
}
interface AB {
    A:'A',
    B:'B'
}
type InKeyOf = {
    [K in keyof AB]:K
}
type InKeyOfKeyIn = {
    [K in keyof AB]:AB[keyof AB]
}
const abc1:InKeyOf = {
    A:"A",
    B:"B"
}
const abc2:InKeyOfKeyIn = {
    A:"B",
    B:"A"
}


const d:OptionalAccount = {
    id:1,
    isEmploy:true,
    notes:['w']
}
d.id=2; // ok
const dd:ReadonlyAccount = {
    id:1,
    isEmploy:true,
    notes:['w']
}
// dd.id = 2; // error!

const ddd:ReadonlyAccount2 = {
    id:1,
    isEmploy:true,
    notes:['w']
}
ddd.id = 2;  // ok



type Dig<T, U extends keyof T> = Pick<T, U>[U]
const obj = {
    a: {
      first: '1',
      second: '2',
      thrid: '3',
    },
    b: 'b',
    c: {
      fourth: '4',
      fifth: '5'
    }
  }

const Dig:Dig<typeof obj,'a'> = {
    first:'3',
    second:'4',
    thrid:'5'
}
type Diff<T, U> = T extends U ? never : T
type DiffExample = Diff<'a' | 'b' | 'c' | 'd', 'a' | 'c' | 'f'>;  // 'b' | 'd' 

아래의 Dig, Diff는 안도형님의 글을 참고하였습니다
안도형님의 블로그

profile
이 블로그의 글은 제 생각을 정리한 글과 인터넷 어딘가에서 배운 것을 정리한 글입니다. 출처는 되도록 남기도록 하겠습니다. 수정 및 건의 오류 등이 있으면 언제든지 댓글 부탁드립니다.
post-custom-banner

0개의 댓글