shldhee / note

개인노트
0 stars 0 forks source link

typescirpt keyof #24

Open shldhee opened 2 years ago

shldhee commented 2 years ago
interface IPerson {
  name: string;
  age: number;
}

const person: IPerson = {
  name: 'Mark',
  age: 39,
};

// type Keys = keyof IPerson; // key의 이름으로 된 문자열 'name'
// const keys: Keys = "" // 'name', 'age' 값 넣을 수 있음

// string | numbere대신 keyof IPerson사용
// IPerson[keyof IPerson] => IPerson["name" | "age"] => IPerson["name"] | IPerson["age"] => string | number
function getProps<T, K extends keyof T>(obj:T, key: K): T[K] { // name , age Ekr
  return obj[key];
}

// getProps(person, 'name')
// getProps(person, 'age')

// const getProps<T> = (obj: T, key: keyof T): T[keyof T] => {
//   return obj[key]; 
//   // key가 name일때 string이 나와야 하는데
//   // string | number로 나오니 에러에러에러 삐뽀
// }
// const getProps = (obj: IPerson, key: keyof IPerson): IPerson[keyof IPerson] => {
//   return obj[key]; 
//   // key가 name일때 string이 나와야 하는데
//   // string | number로 나오니 에러에러에러 삐뽀
// }

// const setProps = (obj:IPerson, key: keyof IPerson, value: string | number): void => {
//   obj[key] = value; 
//   //name이면 string, age면 number
// }

function setProps<T, K extends keyof T> (obj:T, key: K, value: T[K]): void {
  obj[key] = value;
}

setProps(person, "name", "Anna");

// function setProps (obj:IPerson, key: keyof IPerson, value: string | number): void {
//   obj[key] = value;
// }

// const getProps = (obj: IPerson, key: 'name' | 'age'): string | number => {
//   return obj[key]; 
//   // key가 name일때 string이 나와야 하는데
//   // string | number로 나오니 에러에러에러 삐뽀
// }

// const setProps = (obj:IPerson, key:'name' | 'age', value: string | number): void => {
//   obj[key] = value; 
//   //name이면 string, age면 number
// }