You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
단, 인터페이스와 같은 타입 구조체를 이용했을 때 유니온 타입으로 정의하면 타입의 공통된 속성만 제공한다.
interfacePerson{name: string;age: number;}interfaceDeveloper{name: string;skill: string;}functionintroduce(someone: Person|Developer){someone.name;// O 정상 동작someone.age;// X 타입 오류someone.skill;// X 타입 오류}
왜냐하면 introduce() 함수를 호출하는 시점에 Person 타입이 올지 Developer 타입이 올지 알 수가 없기 때문에 어느 타입이 들어오든 간에 오류가 안 나는 방향으로 타입을 추론한다고 한다.
constcapt: Person={name: "capt",age: 100};introduce(capt);// 만약 `introduce` 함수 안에서 `someone.skill` 속성을 접근하고 있으면 함수에서 오류 발생
3.2 인터섹션 타입
& 연산자를 이용해 여러 개의 타입 정의를 하나로 합치는 방식
interfaceDeveloper{name: string;skill: string;}interfacePerson{name: string;age: number;}functionaskSomeone(someone: Developer&Person){someone.age;someone.name;someone.skill;}// Developer, Person 속성 모두를 가지는 새로운 타입 유형으로.askSomeone({name: "개발자",skill: "웹 개발",age: 27});
4. 이넘
enum 이름 { }
특정 값들의 집합을 의미하는 자료형
드롭다운이나, 정해진 목록의 값들을 지정할 때 이넘을 쓰기 좋다.
4.1 숫자형
별도의 값을 지정하지 않으면 숫자형 이넘으로 취급한다.
// 숫자형 이넘enumAvengers{Capt,Ironman,Hulk,}constmyHero=Avengers.Capt;console.log(myHero)// 0// 숫자는 자동으로 `1씩 증가
enumAnswer{Yes="Y",No="N",}functionaskQuestion(answer: Answer){if(answer===Answer.Yes){console.log("정답");}if(answer===Answer.No){console.log("오답");}}askQuestion(Answer.Yes);// YaskQuestion("Yes");// X
리액트에서도 훅 기반 함수형 문법을 주로 쓰고, 뷰에서도 그렇기 때문에 타입스크립트의 클래스 문법을 많이 쓰진 않을 것 같다고 함.
6. 제네릭
<type>
타입을 마치 함수의 파라미터처럼 사용하는 것
매번 타입을 정의하는 것이 아니라, 호출할 때 타입을 넘김으로써 어떤 타입이 와도 유연하게 타입을 사용할 수 있게 됨
functionlogText<T>(text: T): T{returntext;}// 위에서 선언한 함수 호출 방법 2가지// #1consttext=logText<string>("Hello Generic");// #2consttext=logText("Hello Generic");logText<string>('hi');// 위 코드는 아래 코드와 동일한 의미functionlogText<string>(text: string): string{returntext;}
keyof를 사용하면 인터페이스 ShoppingItems에 포함된 key만 인자로 전달할 수 있게 됨
interfaceShoppingItems{name: string;price: number;address: string;stock: number;}functiongetAllowedOptions<TextendskeyofShoppingItems>(option: T): T{if(option==='name'||option==='address'){console.log('option type is string');returnoption;}if(option==='price'||option==='stock'){console.log('option type is number');returnoption;}}getAllowedOptions('nothing');// X