Front_End [JS기반]/타입스크립트

[ 3D Web : Front&Back_Type Script ] 타입스크립트 : 타입 선언의 종류 총정리.

안다미로 : Web3 & D.S 2024. 11. 20. 17:42

 

 

 

[ 3D Web : Front&Back_Type Script ] 

타입스크립트 : 타입 선언의 종류들 정리하기.

 


 

∇ 타입스크립트 : '타입 선언' 정리하기.

목  차

1. 타입 : Boolean
2. 타입 : Number
3. 타입 : String
4. 타입 : Array
5. 타입 : Tuple
6. 타입 : Enum
7. 타입 : Object
8. 타입 : Any
9. 타입 : Unknown
10. 타입 : Null // Undefined
11. 타입 : Never
12. 타입 : Void
13. 타입 : Literal
14. 타입 : Union
15. 타입 : Intersection
16. 타입 : Type Alias
17. 타입 : Interface
18. 타입 : Generic
19. 타입간 대입 가능한 표.

 

 


 

 

Ⅰ. 타입 : Boolean


     ※ 단순하게,   참(true)  / 거짓(false)  값을 판명.

 

let isBoolean: boolean;
isBoolean = true;

let isDone: boolean = false;

 

 


Ⅱ. 타입 : Number


     ※ 정적 타입이라 해서 C / Java 처럼  int / float / double 타입은 존재하지 않고,

         JavaScript의 number 자료형을 그대로 사용합니다.

 

           + 16진수 / 10진수/  2진수/ 8진수 리터럴도 지원합니다.

 

let num: number;
let integer: number = 6;
let float: number = 3.14;

let hex: number = 0xf00d; // 61453
let binary: number = 0b1010; // 10
let octal: number = 0o744; // 484

let infinity: number = Infinity;
let nan: number = NaN;

function plus(num1: number, num2: number): number {
	return num1 + num2;
}

 


Ⅲ. 타입 : String.


     ※ 작은 따옴표(,)  /  큰 따옴표(")  뿐만 아니라,  ES6의 템플릿 문자열도 string 타입에 포함 됩니다.

 

let red: string = 'Red';

let green: string = "Green";
let yourColor: string = 'Your color is' + green;

let myColor: string = `My color is ${red}.`;

function strings(str1: string, str1: string): string {
	return str1 + str1;
}

 

 


Ⅳ. 타입 : Array.


     ※ 배열 타입은 두 가지 방법으로 쓸 수 있습니다.

 

              1. 배열 요소들을 나타내는 '타입' 뒤에  []를 쓰는 방법.

              2. Array <>  배열 타입을 사용하는 방법.

 

let fruits: string[] = ['Apple', 'Banana', 'Mango'];
// or
let fruits: Array<string> = ['Apple', 'Banana', 'Mango'];

 

// 오직 숫자 아이템만 허용
let nums:number[] = [100, 101, 102];

// 오직 문자 아이템만 허용
let strs:string[] = ['apple', 'banana', 'melon'];

// 오직 불리언 아이템만 허용
let boos:boolean[] = [true, false, true];

// 모든 데이터 타입을 아이템으로 허용 (any 타입 - 뒤에서 배움)
let someArr: any[] = [0, 1, {}, [], 'str', false];

// 특정 데이터 타입만 아이템으로 허용 (union 타입 - 뒤에서 배움)
let selects:(number | string)[] = [102, 'apple'];

 

// 나머지 매개변수(스프레드 연산자) 를 이용한 배열 반환 함수
function getArr(...args: number[]): number[] {
   return args;
}
getArr(1, 2, 3, 4, 5); // [1, 2, 3, 4, 5]

 

 


Ⅴ. 타입 : Tuple.


     ※ 튜플은 배열의 서브타입 입니다.

 

           ->> "튜플" 이라는 용어가 생소할지도 모르지만,  "크기와 타입이 고정된 배열" 이라고 이해하면 됩니다.

 

       ex) RGB 색상을 표현하기 위한 튜플

let rgbColor: [number, number, number] = [255, 255, 0];

 

 

       ++ "항상 정해진 갯수의 요소"를 가져와야 하는 배열을 지정해서 응용할 수도 있습니다.

let x: [string, number]; // 튜플 타입으로 선언

x = ["hello", 10]; // 성공
x = [10, "hello"]; // 오류 (원소 타입이 안맞음)
x = ["hello", 10, 99]; // 오류 (원소 갯수가 안맞음)

 

let user: [number, string, boolean] = [1234, 'HEROPY', true];
console.log(user[0]); // 1234
console.log(user[1]); // 'HEROPY'
console.log(user[2]); // true

 

/* 2차원 튜플 */
let users: [number, string, boolean][];
// or
let users: Array<[number, string, boolean]>;

users = [[1, 'Neo', true], [2, 'Evan', false], [3, 'Lewis', true]];

 

 

       ++ 타입 뿐만 아니라 '값' 자체를 고정시킬 수도 있습니다. (강한 타입 지정)

 

/* 타입 뿐만 아니라 값 자체를 고정 */
let tuple: [1, number];
tuple = [1, 2];
tuple = [1, 3];

tuple = [2, 3]; // Error - TS2322: Type '2' is not assignable to type '1'.

 

 

       ++ 단, 유의할점은 '튜플'은 "정해진 타입의 고정된 길이 배열" 을 표현하지만,  이는 "할당(Assign)" 에만 국한됩니다.

 

              -    "  .push()  "   혹은  "  .splice() " 등을 통해 값을 추가하는 행위는 가능합니다.

 

let tuple: [string, number];
tuple = ['a', 1];
tuple = ['b', 2];

tuple.push(3);
console.log(tuple); // ['b', 2, 3];

tuple.push(true); // Error - 그렇다고 해서 튜플에 정의되지 않는 타입을 넣을수는 없다.
// push() 함수를 사용하여 요소를 추가하는 경우 처음 할당된 값의 타입과 정확히 일치해야 한다.

 

 


Ⅵ. 타입 : Enum.


     ※ Enum은 C 혹은 Java와 같은 언어를 사용하면 한번쯤 들어보는 흔하게 쓰이는 타입으로,

           특정 값(상수)들의 집합을 의미합니다.

 

          ++ 튜플 타입이 특정한 타입이나 값을 고정하는 배열이라면,

                Enum은 "특정 값을 고정하는 또 다른 독립된 자료형" 이라고 보면 됩니다.

 

// 상수 집합
enum Avengers { SpiderMan, IronMan, Thor, Hulk }

let hero: Avengers = Avengers.SpiderMan; // 0

 

 

           ++ enum은 인덱스 번호로도 접근 가능합니다.

// 시스템에서는 { SpiderMan = 0, IronMan = 1, Thor = 2, Hulk = 3 } 
//이런식으로 내부적으로 인덱싱이 자동으로 되어있다고 이해하면 된다.
enum Avengers { SpiderMan, IronMan, Thor, Hulk } 

let hero: Avengers = Avengers[0];

 

 

         ++ 필요할 때,  Enum의 인덱스를 유저 편의로 변경하여 사용 가능합니다.

// 직접 인덱스 번호를 정한다면, 시스템에서는 { SpiderMan = 2, IronMan = 3, Thor = 4, Hulk = 5} 
// 이런식으로 내부적으로 인덱싱이 정해진 숫자 이후로 순차적으로 증가한다고 이해하면 된다.
enum Avengers { SpiderMan = 2, IronMan, Thor, Hulk }

let hero: Avengers = Avengers[2]; // SpiderMan
let hero: Avengers = Avengers[5]; // Hulk

 

 


 

Ⅶ. 타입 : Object.


       ※ JS에서의 'object' 는 객체 뿐만 아니라  배열, 함수 까지 'object'로 포함합니다.

 

       ※ TS에서도  마찬가지로  

             기본적으로 typeof 연산자가 "object"로 반환하는 모든 타입을 의미합니다.

 

정확히 number, string, boolean, bigint, symbol, null, 또는 undefined가 아닌 나머지를 의미

 

let obj: object = {};
let arr: object = [];
let func: object = function () {};
let nullValue: object = null;
let date: object = new Date();

 

       -->> Object는 여러 타입의 상위 타입으로 인식되기 때문에,

               TS에서 object를 그대로 타입으로 쓰기에는 문제가 많습니다.

                  ++ object 타입에 객체값을 주고 실제로 조회하면 오류가 발생.

const player: object = { name: 'nico' };
player.name; // Error

 

               

 ※ 정말 객체에 타입을 지정해주고 싶다면,

       객체 속성(Properties)들에 대한 타입을 개별적으로 지정하는 식으로 사용하면 됩니다.

let userA: { name: string, age: number };
userA = {
  name: 'HEROPY',
  age: 123
};

let userB: { name: string, age: number };
userB = {
  name: 'inpa',
  age: false, // Error
  email: 'inpa@naver.com' // Error
};

 


          이렇게 쓰면, 가독성 이슈가 발생.

 

              - 극복을 위해서 TS는 " type 리터널 " 이라고 불리우는 "alias" 기능과  "interface" 문법을 활용합니다.

 

§alias

// type alias
type IUser = {
    name: string,
    age: number
}
 
let userA: IUser = {
    name: 'HEROPY',
    age: 123
};
 
let userB: IUser = {
    name: 'inpa',
    age: false, // Error
    email: 'inpa@naver.com' // Error
};

 

§interface

// interface
interface IUser {
  name: string,
  age: number
}

let userA: IUser = {
  name: 'HEROPY',
  age: 123
};

let userB: IUser = {
  name: 'inpa',
  age: false, // Error
  email: 'inpa@naver.com' // Error
};

 

 


 

Ⅷ. 타입 : Any.


       ※ "Any" 타입은  단어 의미 그대로 모든 타입에 대해서 허용한다는 의미입니다.

 

               == 우리가 JS에서 사용하던 변수의 타입이 사실 'any'라고 봐도 무방.

 

           - any 타입이 존재하는 이유는,

               프로덕트를 만들 때 알지 못하는 타입을 표현해야 하는 경우가 존재할 수 있기 때문입니다.

 

                 -->> ex)  유저로부터 받은 데이터나,  '서드 파티 라이브러리' 같은 동적 컨텐츠에서 변수나 함수를 다룰 때

                                   알수 없는 타입이 존재하는 경우에 유용.

let any: any = 123;
any = 'Hello world';
any = {};
any = null;

let list: any[] = [1, true, "free"];
list[1] = 100;

 

// 명시적으로 any 타입 지정
let product_id: any = 124981;
product_id = 'p9023412'; // any 유형이 설정되었으므로 어떤 유형도 값으로 할당 가능

// 암시적으로 any 타입 지정
let product_id;
product_id = 124981;
product_id = 'p9023412';

 

 

    ☆ 주의 !   :   any 타입을 남용해서 사용하면 안됩니다.

           ( 그럴거면,  JS를 쓰쇼..)

              - 타입스크립트 컴파일의 보호장치를 읽어버리게 됩니다.

 

 

         

const a: any[] = [1, 2, 3, 4]; // 배열
const b: any = true; // 불리언

a + b; // 배열과 불리언을 더했는데 컴파일이 허용하고 있다..

 

강한 타입 시스템의 장점을 유지하기 위해 Any 사용을 엄격하게 금지하려면, tsconfig에 컴파일 옵션 

"noImplicitAny": true를 통해 Any 사용 시 에러를 발생시킬 수 있습니다.

 

 


 

Ⅸ. 타입 : Unknown.


       ※ "Unknown" 타입은  Un 접미어 때문에 부정적인 뜻으로 보이지만,

                 그냥 any와 같다고 생각하면 됩니다.

 

           == 말 그대로,  unKnown은  '알 수 없는 타입'을 의미하며, any와 같이 모든 데이터 타입을 받을 수 있습니다.

 

 

           ◎ any와 unknown을 구분한 이유는??

 

                    1. any는 어떤 것이든지 타입을 허용한다는 뜻.

                    2. unknown은   알 수 없다,  모른다의 어감이 강함.

 

           ★ 이 둘의 차이점은 "엄격함" 입니다.

 

                ex)

                       any타입의 경우,   number 타입의 데이터를 넣고 string 타입의 메소드 length를 사용하는 경우에

                                                     어떠한 에러를 발생시키지 않고 그냥 undefined를 반환합니다.

 

let value : any = 10;
console.log(value.length); // undefined

 

 

                  이와 달리,

 

                   unknown 타입은 any 타입과 동일하게 모든 값을 허용하지만,

                      할당된 값이 어떤 타입인지를 모르기 때문에 함부로 연산을 할 수 없다는 특징을 가집니다.

                      ( 에디터 차원에서 에러를 띄워줌 )

let valueNum: unknown = 10;
let valueStr: unknown = 'Test';

console.log(valueNum.length); // 문제 발생
console.log(valueStr.length); // 문제 발생

 

 

이럴 경우, typeof 연산자를 통해서 타입을 검사함으로서 해결 가능

 

 

☆ any 대신, unknown 타입을 사용하면, 체크를 해야 되는 코드는 많아지겠지만,

        사전에 문제가 되는 부분을 방지할 수 있으므로 any 타입에 비해 안정적인 앱을 개발 가능합니다.

 

 


 

Ⅸ. 타입 : Null / Undefined


       ※ JS에서도 undefined가 하나의 자료형이자 값이었던 것 처럼,

           TS에서도 null 과 undefined 타입이 존재합니다.

 

let nullable: null = null;
let undefinedable: undefined = undefined;

 

 

 

      - 기본적으로 null 과 undefined는   다른 모든 타입의 하위 타입으로 치부됩니다.

             == null 과 undefined를 모든 타입에 할당할 수 있다는 것을 의미합니다.

 

            *단,  tsconfig.json에서   'strick' 모드가 아닐경우에만 가능합니다.

 

/* strick 모드가 아닐경우에만 대입이 가능함 */
let num: number = undefined;
let str: string = null;
let obj: { a: 1, b: false } = undefined;
let arr: any[] = null;
let und: undefined = null;
let nul: null = undefined;
let voi: void = null;

 


컴파일 옵션인   --stricks이나  --strictNullChecks 를 사용하면, null과 undefined는 오직 any와 각자 자신들
타입에만 할당 가능하게 됩니다. (예외적으로 undefined는 void에 할당 가능합)

이 옵션은 불특정한 많은 일반적인 에러를 방지하는 데 도움을 주니, 가능한 경우  --strictNullChecks를 사용할 것을
권장하는 편입니다.

 


◎ stricNullChecks 컴파일 옵션.

 

         - tsconfig.json에서 컴파일 옵션을 true로 줬을 경우,   일반적인 타입 변수에 null을 할당 불가능 !

{
	"strictNullChecks": true, /* 엄격한 null 검사 사용 */
}

 

let assign_name:string = null; // [오류] [ts] 'null' 형식은 'string' 형식에 할당할 수 없다.

if (!assign_name) {
  assign_name = '미네랄';
}

 


 

Ⅹ. 타입 : Never


 ※ never 타입은 'number' 나 'string' 처럼   특정 종류의 자료형을 담기 위한 타입이 아닙니다.

 

 ※ never 타입은 타입스크립트에서 잘못된 것을 알려주기 위한 키워드로써,

               단어 그대로 "절대 발생할 수 없는 타입"을 나타낸다고 보면 됩니다.

 

      ** 보통 다음과 같이 빈 배열을 타입으로 잘못 선언한 경우,  'never'를 볼 수 있습니다.

             

 

 

      - never는 에러를 반환하는 함수 표현식에서, "항상 오류를 발생" 시키거나

                      "절대 반환하지 않는 반환 타입으로도 쓰일 수 있습니다.

 

// 에러를 발생시키는 커스텀 never 타입 함수를 생성
function error(message: string): never {
    throw new Error(message); // 함수는 리턴되지 않고 에러를 throw함
}

function fail() {
    return error("Something failed"); // 커스텀 에러함수 호출
}

const result = fail(); // 반환 타입이 never로 추론된다.

 

 

 

 ※ never 타입 역시도, null이나 undefined처럼 모든 타입에 할당이 가능한 허위 타입입니다.

               : 하지만, !   반대로 어떤 타입도 never에 할당할 수 없습니다(never 자신은 제외)

function getError(): never {
   throw new Error('ERROR');
}

let never_type: never;

never_type = 99; // 오류 발생: 숫자 값을 never 타입 변수에 할당할 수 없다.

// 함수의 반환 값이 never 타입 이기 때문에 오류가 발생하지 않는다.
never_type = getError();

 

 


 

ⅩⅠ. 타입 : Void


 ※ void 라는 단어는 C나 JAVA에서,  함수에서 return 값이 없을 때 사용하는 경우가 있는데

         이때 사용하는 void가  이  void 타입이 맞습니다.

 

 

 

 ※ void는 어떤 타입도 존재할 수 없음을 나타내기 때문에,    any의 반대 타입 같다고 볼 수 있습니다.

      == void는 보통 함수에서 반환 값이 없을 때,  반환타입을 표현하기 위해 쓰인다고 보면 됩니다.

   

// return 값이 없는 함수
function hello(n: number): void {
  let sum: number = n + 1;
}

const hi: void = hello(1); // 값을 반환하지 않는 함수는 실제로는 undefined를 반환
console.log(hi); // undefined

 

     ++ 만일, " void "를 함수가 아닌 변수 타입으로 정의한다면,

                      void 타입 변수에는 " undefined " 와 "null"만 할당이 가능해집니다.

                         == void를 타입 변수로 선언하는 것은 유용하지 않음. !

 

let unusable: void = undefined;
unusable = null; // 성공, tsconfig에서 strictNullChecks 컴파일 옵션을 사용하지 않을때만

           


ⅩⅡ. 타입 : Literal


 ※ 타입이라고 해서 number, string, Array 같은 자료형만을 넣는다고 생각하겠지만,

          "문자열과 숫자에 한해서 직접 값 자체를 타입으로도 선언" 이 가능합니다.

 

 

  ∇ 숫자 리터럴 타입 ( Numeric Literal Types ) 

         타입스크립트의 타입은, 자료형 뿐만 아니라 "값 자체(숫자와 문자 한정) " 를 타입으로 지정할 수 있습니다.

 

 

             === "타입은 웬만하면 아주 정확하게 명시" 하는 것이 TS의 근본이기 때문입니다.

const num: 3 = 3;

const num = 3; // 타입 생략

 

 

  ∇ 문자열 리터럴 타입 ( String Literal Types ) 

        : 문자열 리터널 타입은 문자열에 값을 정확하게 지정할 때 사용됩니다.

type Easing = 'ease-in' | 'ease-out' | 'ease-in-out';

function animate(dx: number, dy: number, easing: Easing) {
   if (easing === 'ease-in') {
      // ...
   } else if (easing === 'ease-out') {
   } else if (easing === 'ease-in-out') {
   } else {
      // null이나 undefined를 전달하면 필터링 실행
   }
}

animate(0, 0, 'ease-in');
animate(0, 0, 'uneasy'); // 오류: "uneasy"는 여기서 허용하지 않습니다

 

 


 

 

ⅩⅢ. 타입 : Union


 ※ "2개 이상의 타입을 허용하는 경우" ,  이를 "유니언(Union)" 이라고 합니다.  [ OR의 의미로도 쓰임 ]

 

      " | "   를 활용해서 타입을 구분하며,  괄호는 단일 타입일 때는 안써도 되지만, 배열일 경우는 씌워야합니다.

 

let union: string | number;
union = 'Hello type!';
union = 123;
union = false; // Error - TS2322: Type 'false' is not assignable to type 'string | number'.

 

// 배열에 문자열과 넘버만을 허용하는데 튜플과 달리 자유로움
// 배열 타입을 UNION으로 표현할때 괄호로 묶어 표현 안그러면 string | number[] 이런식으로 됨
let array: (string | number)[] = ['Apple', 1, 2, 'Banana', 'Mango', 3];
// Or
let array: Array<string | number> = ['Apple', 1, 2, 'Banana', 'Mango', 3];

 

function padLeft(value: string, padding: boolean | number) {
  // ...
}

let indentedString = padLeft("Hello world", true);

 


☆ Union 태그 주의할점.

        

       ex) introduce() 함수의 '파라미터 타입에   "Person" , "Developer"  타입별칭들로 유니온으로 합쳤습니다.

type Person = {
  name: string;
  age: number;
}

type Developer = {
  name: string;
  skill: string;
}

function introduce(someone: Person | Developer) {
  someone.name; // O 정상 동작
  someone.age; // X 타입 오류
  someone.skill; // X 타입 오류
}

          

        - 유니온 타입 or 기능도 된다고 생각해서, 타입 Person도 되고, Developer도 될테니까 

       함수 안에서  각 인터페이스(person,  developer)에 담겨있는 속성들인 age나 skill을 사용 가능할거라 생각하겠지만

 

      ++   TS의 관점에서 introduce() 함수를 호출하는 시점에서

            person타입이 올지,  Developer타입이 올지 알 수 가 없기 때문에 에러가 발생합니다.

 

 

◇ 즉, tsc는 어느 타입이 들어오든 간에 오류가 안 나는 방향으로,

     확실하게 타입을 추론해내는 특성이 있습니다. [ 항상 값이 확실해야 함 !]

 

        ==>> 위에 코드에선 결과적으로,  두 인터페이스가 공통적으로 가지고 있는 name에만 정상 접근이 가능합니다.

 

 

함수에서도  리턴값을 유니온으로 사용하게 되면,  에러가 발생합니다.

     

ex)

      -- >  모든 경우의 수를 고려해서,  x와 y의 매개변수에 'number'가 들어오느냐 'string' 이 들어오느냐에 따라서

function add(x: string | number, y: string | number): string | number {
   return x + y;
}

add(1, 2);
add('1', '2');
add(1, '2');

   리턴값이 달라지도록 유니온을 명시했지만,    '컴파일러'의 입장에서는 옳지 않은 방식입니다. 

  

 

function add(x: string | number, y: string | number): string | number {
   return x + y;
}

const result: string | number = add(1, 2);
result.charAt(1);

이런 식으로 string 및 number 타입의 "result" 변수에  add(1,2) 의 값을 받도록 코드를 구성해주면, 

유니온 입장에서 맞는 것 같지만??   이 역시 오류가 발생합니다.

 

이렇게 논리적으로 구성해주더라도!

"컴파일러 입장" 에서는 여전히  result 변수가  string인지, number인지 확실하게 알 수 없기 때문입니다.

 

 

 

++ "함수 오버로딩"으로 해결 가능.

 

 


 

ⅩⅣ. 타입 : Intersection


 

 ※  &(ampersand)  를 사용해서 2개 이상의 타입을 조합하는 경우,  이를 "인터섹션(Intersection)" 이라고 합니다.

 

 

        ◎ 위쪽의 Union(유니언)을 마치   "또는(Or)" 과 같이 이해할 수 있는 것처럼,

                        Intersection(인터섹션)은  "그리고(And) == 교집합"와 같이 보면 됩니다.

 

 

 

     ● Intersection(인터섹션)은 새로운 타입을 생성하지 않고,  기존에 타입들을 조합 가능하기에 유용하지만

             " 자주 사용되는 방법"은 아닙니다.

 

 

type Person = {
   name: string;
   age: number;
};
type Developer = {
   name: string;
   skill: number;
};

const heropy: Person = {
  name: 'Heropy',
  age: 36,
  skill: 11 // Error - { name: string; age: number; skill: number; }' 형식은 'person' 형식에 할당할 수 없습니다. 개체 리터럴은 알려진 속성만 지정할 수 있으며 'person' 형식에 'skill'이(가) 없습니다
};

// 두 타입 별칭을 합쳐 하나의 { name: string, age: number, skill: number } 이라는 타입을 구성한다.
const neo: Person & Developer = {
   name: 'Neo',
   age: 85,
   skill: 11,
};

 

!! 맨 밑줄의 코드처럼  타입을  "&" 교집합을 해서 타입을 추론하는 것보다,
그냥 새로운 타입 하나 만들어서 할당하는 것을 권장합니다.

 

 


ⅩⅤ. 타입 : Type Alias


 

 ※  타입 별칭(Type Alias)는 "사용자가 정의하는 타입"   변수입니다.

 

     ==> 한줄로 복잡하고 긴 타입을 정의하면 가독성이 좋지 않기 때문에,

              type 별칭으로 타입 형태를 묶어둔 뒤 별칭을 타입명으로 선언해서 사용하는 방법이라고 볼 수 있습니다.

 

 

type alias 와 interface의 변수명은 대문자로 쓰는게 국룰

 

let Dom: {version:string, el:(selector:string)=>void, css:(prop:string)=>void} = {
  version: '0.0.1',
  el(){},
  css(){}
};

이거를

type Operation = {
	version: string, 
    el: (selector:string) => void, 
    css: (prop:string) => void
}

let Dom: Operation = {
  version: '0.0.1',
  el(){},
  css(){}
};

요론식으로

 

 

☆ 타입 별칭을 선언하는 방법은 변수와 비슷합니다.

 

    -   앞부분에 "자료형"을 선언하고,  뒷부분에 자료형에 부합하는 "값"을 대입하는 것처럼,

            => "타입"도 type 이라는 자료형을 선언하고서 뒤에 타입값을 넣어주면 됩니다.

 

 

// type 변수명 = 타입;
type Name = string;
type Age = number;

let name: Name = 'Tom';
let age: Age = 20;

 

 

 


ⅩⅥ. 타입 : Interface


 ※  Interface(인터페이스)는 상호 간에 정의한 약속 혹은 규칙을 의미합니다.

 

       === " 타입을 정의한 것들을 한데 모은 객체 타입 "

       === "객체의 껍데기"  혹은 "객체의 설계도"

 

 

     ◇ TS에서의 인터페이스는 밑에 범주에 대해서 약속을 정의합니다.

 

             1.  객체의 스펙 ( 속성과,  해당 속성의 타입 )

 

             2. 함수의 파라미터

 

             3. 함수의 스펙(파라미터, 반환 타입 등)

 

             4. 배열과 객체를 접근하는 방식

 

             5. 클래스.

 

 

 ★ 인터페이스는 단순히 타입 지정 뿐만 아니라,  자체 확장하여 활용도를 높일 수 있다는 장점 !

 

interface Person {
  name: string;
  age: number;
}

interface Developer extends Person { // 인터페이스 상속
  skill: string;
}

function logUser(obj: Developer) {
  console.log(obj.name);
  console.log(obj.age);
  console.log(obj.skill);
}

let person = { 
  name: 'Capt', 
  age: 28, 
  skill: 'typescript, javascript' 
};

logUser(person);

 

 

☆ ☆

  [  type alias   vs  interface 사용 선호도 ]

   : 타입 별칭과 인터페이스는 얼핏보면 비슷해 보이지만, 

     이 두가지의 가장 큰 차이점은 타입의 확장 가능 /  불가능 여부입니다.

 

         - 인터페이스는 다양한 방법으로 확장이 가능한데에 반해  //  타입별칭은 확장이 불가능합니다.

 

         == 간단한 타입 집합으로 이용할때는 'type alias'를 쓰고,

               가능하면 interface로 선언해서 사용하는 것을 추천되는 편.

 

 


ⅩⅦ. 타입 : Generic


 ※  Generic(제네릭)은 타입을 변수화하였다고 생각하면 됩니다.

 

        - 우리가 데이터를 직접 다루지않고, '변수'라는 상자에 담아서 사용하는 이유는 재사용서을 높이기 위해서입니다.

 

        - 타입을 마치 함수 파라미터 처럼 나중에 대입하도록 하여 재사용성을 높이기 위해 탄생한 타입

               "제네릭 타입"이라고 이해하면 됩니다.

 

○ 제네릭의 선언 문법을  <>  꺾쇠 괄호 기호를 이용합니다.

       괄호 안에는 변수명을 넣어주면 됩니다.

 

function getText<T>(text: T): T {
   return text;
}

getText<string>('hi'); // 'hi'
getText<number>(10); // 10
getText<boolean>(true); // true

 

 


ⅩⅧ. 타입 간 대입 가능한 표.