ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TS 타입
    JavaScript/TypeScript 2021. 6. 12. 19:23

     

    TS와 JS 타입 차이점

     

    - TS는 Static Types, 개발 중간에 타입을 체크

    - JS는 Dynamic Types, 런타임에 진입해야만 타입을 체크 (실제로 실행을 해봐야 오류를 잡을 수가 있다)

     

    // JavaScript
    
    function add(a, b) {
      if (typeof a !== 'number') || typeof b !== 'number') {
        throw new Error('Incorrect input!');
      }
      return a + b;
    }
    
    const result = add(50, 25);
    
    // TypeScript
    function add(a: number, b: number) {
      return a + b;
    }
    
    const result = add(50,25);

     

    Primitive Type

     

    - 오브젝트와 레퍼런스 형태가 아닌 실제 값을 저장하는 자료형

    - ES6 (ES2015) 기준 6가지

    • boolean
    • number
    • string
    • symbol
    • null
    • undefined

     

    Boolean

     

    let isDone: boolean = false;
    
    isDone = true;
    
    // 출력 결과 'boolean'
    console.log(typeof isDone)
    
    let isOk: Boolean = true;
    
    // 아래는 오류 발생
    //let isNotOk: boolean = new Boolean(true);

     

    Number

     

    // JS와 같이 TS의 모든 숫자는 부동 소수점 값
    
    // 10진수 리터널
    let decimal: number = 6;
    
    // 16진수 리터널
    let hex: number = 0xf00d;
    
    // 2진수 리터널
    let binary: number = 0b1010;
    
    // 8진수 리터널
    let octal: number = 0o744;
    
    let NotANumber: number = NaN;
    
    let underscoreNum: number = 1_000_000;

     

    String

     

    let myName: string = 'Yoo';
    
    myName = "LEE";
    
    // Template String
    // 행에 걸쳐있거나, 표현식을 넣을 수 있는 문자열
    // backtick 기호 (``) 에 둘러쌓임
    // 포함된 표현식은 `${ expr }` 
    
    let Name: string = 'IT Blue';
    let age: number = 55;
    
    let setence: string = `Hello, My Name is ${ Name }.
    I'll be ${ age + 1 } years old next month.`;
    
    // 출력 결과
    // Hello, My Name is IT Blue.
    // I'll be 56 years old next month.
    console.log(setence)

     

    Symbol

     

    // Symbol() 함수로 symbol 타입을 생성
    // Symbol은 프리미티브 타입의 값을 담아서 사용
    // 고유하고 수정이 불가능한 값으로 생성
    // 주로 접근을 제어하는데 사용
    
    // 출력 결과: false
    console.log(Symbol('food') === Symbol('food'));
    // 출력 결과: symbol
    console.log(typeof Symbol('Yoo'));
    
    const sym = Symbol();
    
    const obj = {
      [sym]: "value",
    };
    
    // 출력 결과: value
    console.log(obj[sym]);

     

    Null & Undefined

     

    // null 이라는 값으로 할당된 것을 null 이라고 함
    // 무언가가 있는데, 사용할 준비가 덜 된 상태
    // null 타입은 null 값만 가질 수 있다
    // 런타임에서 typeof 사용 시에 값은 object
    
    // 값을 할당하지 않은 변수는 undefined 라는 값을 가짐
    // 무언가가 아예 준비가 안된 상태
    // object 의 property 가 없는 경우에도 undefined
    // 런타임에서 typeof 사용 시에 값은 undefined
    
    // let MyNmae: string = null; (오류)
    // let u: undefined = null; (오류)
    
    let v: void = undefined;
    
    let union: string | null = null;
    union = "Yoo";
    
    let n: null = null;
    // object
    console.log(typeof n);
    
    let u: undefined = undefined;
    // undefined
    console.log(typeof u);

     


     

    Object

     

    non-primitive (primitive type 이 아닌 것) 을 나타냄

     

    // create by object literal
    const person1 = {name: 'Yoo', age: 27};
    
    // person1 is not "object" type
    // person1 is "{name: string, age: number}" type.
    
    // create by Object.create
    const person2 = Object.create({name: 'Kim', age: 30});
    
    let obj1: object = {};
    obj1 = {name: 'TS'};
    obj1 = [{name: 'TS'}];
    
    // 아래는 에러 발생
    // obj = 25; 
    // obj = "LEE";
    // obj = true;
    // obj = Symbol();
    // obj = null;
    // obj = undefined;

     

    declare function create(o: object | null): void;
    
    create({ prop: 0 }); // 성공
    create(null); // 성공
    
    create(42); // 오류
    create("string"); // 오류
    create(false); // 오류
    create(undefined); // 오류

     

    Array

     

    // 배열 선언 (2가지 방법)
    // let list: number[] = [1, 2, 3]; 
    // let list: Array<number> = [1, 2, 3] ; (제네릭 배열 타입)
    
    // let list: number[] = [1, 2, 3, "4"]; (오류 발생)
    let list: (number | string)[] = [1, 2, 3, "4"]; 

     

    Tuple

     

    // tuple
    // 요소의 타입과 개수가 고정된 배열을 표현
    
    let x: [string, number];
    
    x = ["Hello", 39];
    
    // x = [10, 'Yoo']; (오류 발생)
    
    const person: [string, number] = ["Yoo", 25];
    
    const [first, second] = person;
    // const [first, second, third] = person; (오류 발생)

     

    Any

     

    - 어떤 타입이어도 상관없는 타입

    - 컴파일 타임에 타입 체크가 정상적으로 이뤄지지 않기 때문에 최대한 쓰지 않는 것을 권장

     

    let notSure: any = 4;
    notSure = "maybe a string instead";
    notSure = false; //

     

    Unknown

     

    - TS 3.0 부터 지원

    - unKnown 타입도 any와 마찬가지로 모든 타입의 값이 할당될 수 있다

    - unKnown 타입으로 선언된 변수는 any를 제외한 다른 타입으로 선언된 변수에 할당될 수 없다

     

    declare const maybe: unknown;
    
    // const aNumber: number = maybe; (오류)
    
    if (maybe === true) {
      const aBoolean: boolean = maybe;
    
      // const aString: string = maybe; (오류)
    }
    
    if (typeof maybe === 'string') {
      const aString: string = maybe;
    
      // const aBoolean: boolean = maybe; (오류)
    }

     

    Never

     

    - never 타입은 모든 타입의 subtype 이며, 모든 타입에 할당이 가능하다

    - 하지만 never 에는 어떤 것도 할당이 불가능하다 (any 포함)

    - 잘못된 타입을 넣는 실수를 막고자 할 때 사용

     

    function error(message: string): never {
      throw new Error(message);
    }
    
    function fail() {
      return error("failed");
    }
    
    function infiniteLoop(): never {
      while(true) {}
    }
    

     

    Void

     

    - 어떤 타입도 존재할 수 없음을 의미 (any의 반대)

    - 보통 함수에서 반환 값이 없을 때 반환 타입을 표현하기 위해 쓰임

     

    function returnVoid(message: string): void {
      console.log(message);
    
      return;
    }
    
    returnVoid('리턴X');

     

     

    'JavaScript > TypeScript' 카테고리의 다른 글

    TS 인터페이스  (0) 2021.06.19
    TS 컴파일러  (0) 2021.06.18
    TS 타입 시스템  (0) 2021.06.17
    TS 설치  (0) 2021.06.12
    TS 알아보기  (0) 2021.06.10

    댓글

Designed by Tistory.