타입 스크립트는 개발하는 당시에는 js 보다는 형에 있어 훨씬 strict 한 규칙이 적용되어 까다롭고, 개발 속도가 더딘듯 느껴지기도 하지만 코드의 완성도나 디버깅시 용이한 장점을 가진다고한다.
 
예전에도 string 인줄 알았던 데이터가, 실은 다른 형태여서 typeOf 로 타입을 검증해서 디버깅했던 적이 있다. json file 역시 stringify로 스트링 형변환 해주는 것이 필수적이다. 사소해 보이는 type 이지만 막상 코드가 왜 안돌아가나 한참 고민하던것이 실은 type 문제였던 적이 꽤 된다. 그렇다고 사람이 일일이 타입을 확인하는 것은 시간도 많이 걸리고, 정확성이 떨어지기에, 방대한 코드 작업을 할때 내가 미처 확인하지 못한 부분까지 자동으로 잡아내 줄 수 있다면 큰 도움을 받을 수 있을것이다. 그래서 등장한 것이 "Typescript" 되시겠다.
const name = "Nicolas",
  age = 24,
  gender = "male";
const sayHi = (name, age, gender) => {
  console.log(`hello ${name}, you are ${age}, you are a ${gender}`);
};
sayHi(name, age, gender);
// 여기서 params 한개가 누락되면 ts에서는 compile 되지 않는다.
// params 옆에 ? 를 붙이면 optional 하게 읽힌다. ex) gender?
export {};
const sayHi = (name: string, age: number, gender: string): string => {
  //반환하는 함수의 형도 명시해주어야 한다. 여기서는 string
  return `hello ${name}, you are ${age}, you are a ${gender}`;
};
console.log(sayHi("jiyoung", 29, "female"));
interface Human {
  name: string;
  age: number;
  gender: string;
} //interface 는 js 로 compile 되지 않는다. 이를 대신해 class 를 사용함.
const person = {
  name: "jiyoung",
  age: 24,
  gender: "female",
};
const sayHi = (person: Human): string => {
  return `hello ${person.name}, you are ${person.age}, you are a ${person.gender}`;
};
console.log(sayHi(person));
class Human {
  public name: string;
  public age: number; //privacy 로하면 외부에서 접근 불가.class 내에서만 접근 가능.
  public gender: string;
  // class 가 생성될때마다 호출
  constructor(name: string, age: number, gender?: string) {
    this.name = name; //property name 과 같다는 뜻
    this.age = age;
    this.gender = gender;
  }
}
const person = {
  name: "jiyoung",
  age: 24,
  gender: "female",
};
const sayHi = (person: Human): string => {
  return `hello ${person.name}, you are ${person.age}, you are a ${person.gender}`;
};
console.log(sayHi(person));
const lynn = new Human("lynn", 18, "female");
console.log(sayHi(lynn));
대단해요!