type 또한 중괄호로 감싸서 이름속성들을 지정할수 있는데, 이 타입들을 교차, intersection 하여 두 타입이 포함된 타입으로 지정할 수 있다
type cup = { name: string;}type brand = { brandName: string}type brandedCup = cup & brand;// 당연한 얘기지만 :brandedCup 대신 :cup & brand 로 타입지정을 해도 상관없다let starbucksGrandeSizeCup: brandedCup = { brandName: "스타벅스", size: "grande",}
인터섹션타입을 지정할 때 값을 할당할수 없는 타입을 만들 수도 있으므로 유의해야한다
type impossible = number & string;let testImpossible: impossible = 10; // Error
리터럴 타입 (Literal Type)
우리가 이해하기로 타입은 보통 기본 자료형들을 사용하고 조합하여 만들어야한다고 의식하고, 그렇게 알고 지내왔다. 하지만 타입스크립트에서는 사용자가string이나 number 타입을 자기 마음대로 지정하여 타입으로 사용할 수 있다.
방법이 두가지 있는데 let으로 미리 함수의 타입을 지정하고 가는 방식과, 우리가 하던대로 type으로 지정하는 방식이 있다
````ad-whitetitle: let 방식```tslet myFunc: (arg1: number, arg2: number) => number;myFunc = (x, y) => x + y;```````````ad-whitetitle: type 방식```tstype MathOperation = (arg1: number, arg2: number) => number;let add: MathOperation = (x, y) => x + y;let multi: MathOperation = (x, y) => x * y;``````ts// 이렇게 객체타입 안에도 담을 수도 있다곤 하는데 어떻게 활용할지 잘 모르겠다type MathOperation = { (arg1: number, arg2: number): number; // 이 코드가 없으면 위 코드와 같은 꼴인 식이다. // 선택적속성(?)을 사용해야 함수 타입지정할때 에러가 안난다 description?: string;}let add: MathOperation = (x, y) => x + y;add.description = "This is function adds two numbers";let multi: MathOperation = (x, y) => x * y;multi.description = "This is function mutliplies two numbers"```````
내가 범한 오류
let myFunc: (arg1: number, arg2: number) => number;myFunc: (x: number, y: number, z: number) => number; // 에러발생myFunc = (x, y, z) => x + y + z;
let으로 선언되어있기 때문에 타입도 변경할수 있을까 싶어서 해봤는데 에러가 발생한다.
타입스크립트는 타입이 한번 지정되면 변경 할 수 없다 그 이유로
타입 안정성 유지
코드의 다른 부분에서 해당 변수를 사용할 때 타입이 항상 일정하다는것을 보장할 수 있다.
타입의 예측 가능성
타입이 고정되어 있으면 개발자가 그 변수가 어떤 타입을 가지는지 예측할 수 있으면 코드의 동작을 더 쉽게 이해할 수 있다.
어떻게 객체타입의 속성으로 함수를 지정하는 것을 활용할지 잘 모르겠다 (타입 방식의 밑에 방식)
사실 함수타입을 사용할지도 조금 미지수긴한데 일단은 타입방식의 윗방식인 type 타입이름 = (변수: 타입) => 반환타입 만 기억해두자