interface IName {
  name:string
}
interface IData extends IName {
 data:{
   product:string
   ordernumber:number
 }
}
const salesProduct:IData = {
  name:'candy',
  data: {
  	product:'orange taste candy',
  	ordernumber: 14512245
  }
}
&(엔퍼센드)로 확장한다.type TName = {
  name:string
}
type TDATA =  TName & {
 data:{
   product:string
   "production-data":number
 }
}
const salesProduct:TDATA = {
  name:'candy',
  data: {
  	product:'orange taste candy',
  	"production-data": 14512245
  }
}Interface는 interface의 이름이 같으면 자동확장된다.

IData의 프로퍼티에 origin이 추가되면서, salesProduct2에 오류가 발된다.
결론은 인터페이스와 타입 별칭중 일반적으로는 인터페이스를 지향하지만 무엇이든 사용할 수 있다.
복잡한 타입 union이나 튜플 등을 사용할때는 타입 별칭을 사용한다.
Pick : 하위 집합 내에 사용할 key를 구체적으로 명시
Omit : 하위 집합 내 제거할 key를 구체적으로 명시
Partical: 하위 집합 내 key 중 하나를 사용(명시하지 않음)
Record<key type, value type>: type,interface를 키:값 형식으로 매핑
interface IBeachInfo {
  beachname: string;
  beachlocation: string;
  isopen: boolean;
}
 
type TBeachPreview = Pick<IBeachInfo, "beachname" | "beachlocation">;
 
const beach: TBeachPreview = {
  beachname: "Gyeong-Po",
  beachlocation: "somewhere"
};하위 집합 내 제거할 key를 구체적으로 명시한다.
복수로도 제거가 가능하다.
interface IStudyInfo {
  title: string
  description: string
  completed: boolean;
  createdAt: number;
  member: string[]
}
 
type TStudyPreview = Omit<IStudyInfo, "createdAt">;
 
const study:TStudyPreview  = {
  title: "react-handling-skills",
  description:'now we learning how to adjust tailwind.css at react ',
  completed: false,
  member: ['Myungseong','fame','eremes','reputation']
};
 
type TStudySimpleInfo = Omit<IStudyInfo, "completed" | "createdAt" | "member">;
 
const studySimpleInfo: TStudySimpleInfo = {
  title: "Deepdive study",
  description: "we study at pm 10:00 to am 12:00",
};interface IFeeds {
  username: string;
  description: string;
}
 
function replyFeeds(todo: IFeeds, fieldsToUpdate: Partial<IFeeds>) {
  return { ...todo, ...fieldsToUpdate };
}
 
const feedsData = {
  username: "myungseong1114",
  description: "타스는 어렵지만 재밌다.",
};
 
const feedsContent = replyFeeds(feedsData, {
  description: "자세한 내용은 타스 핸드북으로",
});interface IDevInfo {
  end: string;
  age: number;
  desc: string;
}
 
type TDevName = "eremes" | "fame" | "reputation";
type TPersonnelEvaluation = {
  point: number;
  report: string;
}
const devList: Record<TDevName, IDevInfo> = {
  eremes: { end:'front', age: 10, desc: "Persian" },
  fame: { end:'back', age: 5, desc: "Maine Coon" },
  reputation: { end:'full', age: 16, desc: "British Shorthair" },
};
 
const SecondQuarterPersonnelEvaluation: Record<TDevName,TPersonnelEvaluation> = {
  eremes: {point: 100, report:'he is genius'},
  fame: {point: 110, report:'he is really genius'},
  reputation: {point: 100, report:'he is super genius'}
}