다양한 타입지정

타입스크립트

기본 타입스크립트 문법 (2)

타입 별칭 (Type Aliases)

지금까지 소개한 문법으로 타입지정을 하다가는 타입지정만 하다 하루가 갈 것이다.

다행이도 타입스크립트에서는 사용자가 타입을 만들어 사용할 수 있는 기능을 제공한다

// 유니온 타입을 타입 별칭으로 지정
type nsb = number | string | boolean;
 
// 타입 별칭으로 지정한 것을 다시 유니온타입으로 사용가능
type nullableNsb = nsb | null;
type nsb = number | string | boolean;
 
let anyValue: nsb = 10;
anyValue = "hello";
anyValue = true;
anyValue = null; // 컴파일 오류
 
type nullableNsb = nsb | null;
 
let nullableValue: nullableNsb = null; // 컴파일 가능
nullableValue = 10;
nullableValue = undefined; // 컴파일 오류

인터섹션 타입 (Intersection Type)

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 타입을 자기 마음대로 지정하여 타입으로 사용할 수 있다.

type Food = "rice" | "noodle" | "meat";
 
const myFood1: Food = "meat";
const myFood2: Food = "burger" // 컴파일 오류
 
type Dice = 1 | 2 | 3 | 4 | 5 | 6;
const myDice1: Dice = 4;
const myDice2: Dice = 0; // 컴파일 오류

함수 타입

방법이 두가지 있는데 let으로 미리 함수의 타입을 지정하고 가는 방식과, 우리가 하던대로 type으로 지정하는 방식이 있다

````ad-white
title: let 방식
```ts
let myFunc: (arg1: number, arg2: number) => number;
 
myFunc = (x, y) => x + y;
```
````
````ad-white
title: type 방식
```ts
type 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으로 선언되어있기 때문에 타입도 변경할수 있을까 싶어서 해봤는데 에러가 발생한다. 타입스크립트타입이 한번 지정되면 변경 할 수 없다 그 이유로

  1. 타입 안정성 유지 코드의 다른 부분에서 해당 변수를 사용할 때 타입이 항상 일정하다는것을 보장할 수 있다.
  2. 타입의 예측 가능성 타입이 고정되어 있으면 개발자가 그 변수가 어떤 타입을 가지는지 예측할 수 있으면 코드의 동작을 더 쉽게 이해할 수 있다.

어떻게 객체타입의 속성으로 함수를 지정하는 것을 활용할지 잘 모르겠다 (타입 방식의 밑에 방식)

사실 함수타입을 사용할지도 조금 미지수긴한데 일단은 타입방식의 윗방식인 type 타입이름 = (변수: 타입) => 반환타입 만 기억해두자