ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • any와 unknown, union(TS)
    카테고리 없음 2023. 12. 19. 19:16

    어쩔수 없는 가변적인 타입의 데이터를 저장하고 싶다면 

     

    ANY보다는 UNKNNWON을 쓰는게 좋다.

     

    ANY - UNKNOWN은 어떠한 타입이 올지 모르겠다면 

    그때 쓴다.

     


    ANY 타입

     

    ANY타입은 모든 타입에 사용가능한 슈퍼 타입 

    어떠한 타입이든 저장이 가능하다

     

    let anything: any;
    anything = 5; // 최초에는 숫자를 넣었지만
    anything = 'Hello'; // 문자열도 들어가고요
    anything = { id: 1, name: 'John' }; // JSON도 들어가네요

     

    정말 아무거나 들어갈 수 있는 그런 타입으로 쓰인다.

    즉, 넘버도 스트링도모두 들어간다

     

    이게 아니었다면 에러가 났을 것이다.

     

    정말 어쩔 수 없이 써야할 때

     

    예를들면 RDB같은 포맷은 스키마에 맞게 들어오는데

    NOSQL은 관계형이 아니기에 가변적인 데이터를 다루는데

     

    그럴때 사용가능하다.

     


    TS은 타입의 안정성을 확보하기 위함인데 

     

    ANY을 쓰는게 맞나요?

     

    ANY는 코드의 안정성을 떨어뜨리니 가급적 사용금지


    UNKNOWN

     

    그럴 때 쓰이는 타입

    모든 타입을 저장가능하다

     

    그러나 명시적으로 나타내야한다. 

     

    let unknownValue: unknown = '나는 문자열이지롱!';
    console.log(unknownValue); // 나는 문자열이지롱!

    let stringValue: string;
    stringValue = unknownValue; // 에러 발생! unknownValue가 string임이 보장이 안되기 때문!
    stringValue = unknownValue as string;
    console.log(stringValue); // 나는 문자열이지롱!

     

    stringValue = unknownValue as string; 이런식으로 타입은 스트링이다고 단언을 해준다. 


     

    let unknownValue: unknown = '나는 문자열이지롱!';
    let stringValue: string;

    if (typeof unknownValue === 'string') {
      stringValue = unknownValue;
      console.log('unknownValue는 문자열이네요~');
    } else {
      console.log('unknownValue는 문자열이 아니었습니다~');
    }

     

    이런식으로 단언하지 않아도 가능은하다.

     

    타입단언(AS TYPE)이 정답은아니지만 

     

    그래도 단언해주는게 좋다.


     

    UNION

     

    언노운은 단언은 할 수 있지만 가변성이기에 안정성이 떨어지고 그럴때 UNION을 사용한다. 

     

    그렇게 되면 UNION으로 선언해주면 불변성을 갖는다

     

    type StringOrNumber = string | number; // 원한다면 | boolean 이런식으로 타입 추가가 가능해요!

    function processValue(value: StringOrNumber) {
      if (typeof value === 'string') {
        // value는 여기서 string 타입으로 간주됩니다.
        console.log('String value:', value);
      } else if (typeof value === 'number') {
        // value는 여기서 number 타입으로 간주되구요!
        console.log('Number value:', value);
      }
    }

    processValue('Hello');  //스트링이나온다.
    processValue(42);  // 넘버가 나온다.

     

    이런식으로 타입을 지정해주면 스트링값을 넣으면 타입이 스트링, 넘버를 넣어주면 넘버가 나오고 타입은 변하지 않는다.

     

    이렇게 넘버아니면 숫자다 이런식으로 사용을하면

     

    그 두값만 받을수 잇는 함수를 선언한 것이다. 

Designed by Tistory.