반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 메이븐 골
  • 자바 디자인패턴
  • bean Validation
  • prerendering
  • 메이븐 페이즈
  • next js app
  • 팩터리 메서드 패턴
  • serverless computing
  • 토비의 스프링
  • 플라이웨이트패턴
  • 싱글톤
  • Java
  • item9
  • item8
  • 자료구조
  • 스프링 검증
  • 추상 팩터리 패턴
  • 자바스크립트 면접
  • pnpm
  • 객체복사
  • rust
  • 싱글톤 패턴
  • 자바
  • 슬로우 쿼리
  • 빈 검증
  • 프로그래머의 뇌
  • try-with-resources
  • 이펙티브 자바
  • 이펙티브자바
  • 도커공식문서
  • NEXT JS
  • 디자인패턴
  • Pre-rendering
  • 이펙티브 자바 item9
  • 메이븐 라이프사이클
  • Javadoc 자바독 자바주석 주석 Comment
  • 참조 해제
  • 러스트
  • 자바스크립트
  • 작업기억공간
  • 서버리스 컴퓨팅
  • MSSQL
  • Next.js
  • 자바스크립트 인터뷰
  • 알고리즘
  • 싱글턴
  • item7
  • 자바 검증
  • 외래키 제약조건
  • 느린 쿼리

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

Typescript

TS018. 타입스크립트 Unknown 타입과 Any 타입 비교

2023. 12. 30. 11:51

Unknown 타입

  • any 와 동작이 흡사하여 주로 any 와 비교된다.
  • any 는 유형 검사를 우회한다.
  • 반면, unknown 은 값에 대한 연산을 수행하기 전에 명시적 assertion 혹은 narrowing 을 통해 타입 안정성을 유지하는 것이 가능하다.
  • unknown 은 타입스크립트 3.0 에서 도입되어, any 대신 사용했을 때 안정성이 더 뛰어나다.

any, unknown 타입에 다른 값을 할당하는 예시

  • 두 타입으로 선언된 변수라면 어떤 primitive 타입의 값이든 할당이 가능하다.
let unknown: unknown;

unknown = "ab"; // string 할당
unknown = 123; // number 할당

let any: any;

any = "ab"; // string 할당
any = 123; // number 할당
  • 서로가 서로의 타입에 할당하는 것도 가능하다.
// any 와 unknown 의 경우 서로 할당이 가능하다.
let any2: any = unknown;
let unknown2: unknown = any;

다른 타입의 변수에 unknown, any 를 할당하는 예시

  • 다른 타입의 변수에 할당할 때는 any 는 마찬가지로 아무데나 할당이 가능하다.
  • 단, unknown 은 any, unknown 외에는 어떤 타입의 변수에도 할당이 불가능하다.
// unknown 은 any, unknown 외의 다른 타입의 변수에 할당이 불가능하다.
let arr: string[] = any; // 정상
let arr2: string[] = unknown; // 컴파일 타임 에러

메서드 이용 시 예시

  • any 타입의 변수에서는 어떤 메서드를 호출해도 컴파일 타임 에러가 나지 않는다.
    • 마치 타입스크립트를 사용하지 않은 그냥 자바스크립트 변수 같다.
  • 반대로 unknown 타입은 내로잉이 되기 전까지는 어떤 메서드를 호출해도 컴파일 타임 에러가 난다.

any 타입의 경우

let value: any;

// You can do anything with 'any', no errors are raised
value = 5; // OK
value = "hello"; // OK
value.someMethod(); // OK, no type checking

// No errors even if the property or method doesn't exist
value.nonExistentProperty; // OK
value.nonExistentMethod(); // OK

unknown 타입의 경우

let value: unknown;

// Assigning any value to 'unknown' is fine
value = 10; // OK
value = "world"; // OK

// But you cannot perform any operations without type checking
value.someMethod(); // Error: Object is of type 'unknown'
value.nonExistentProperty; // Error: Object is of type 'unknown'

// You need to use type assertions or type guards
if (typeof value === "string") {
  console.log(value.toUpperCase()); // OK after type checking
}

type predicate 의 경우

  • Type Predicate 의 경우, any 와 unknown 둘 다 타입 유추가 가능하지만, 유추 전까지는 어떠한 연산도 불가능한 unknown 타입을 사용하는 것이 더 안정적이다.
// 사실 차이가 없다. 단, unknown 은 predicate 전까진 관련된 모든 작업이 에러로 표기되므로 unknown 을 사용하는 것이 더 안정적일 것이다.
if (isString(unknown)) {
  unknown; // string 으로 타입 유추가 된다.
}

if (isString(any)) {
  any; // string 타입으로 유추가 된다.
}

union 을 이용하는 경우

  • unknown 은 유니온 연산을 했을 때 primitive 타입과 유니온 되면, unknown 으로 추론이 된다.
    • 단, any 와 연산했을 때만 any 로 추론된다.
  • any 는 어떠한 타입과 유니온 연산을 해도 any 가 추론된다.
// 어떤 primitive 타입과 union 연산을 해도 unknown 타입이 된다.
type u1 = unknown | number; // unknown 으로 추론된다.
type u2 = unknown | string; // unknown 으로 추론된다.
type u3 = unknown | boolean; // unknown 으로 추론된다.
// 단, any 타입과 union 을 하는 경우에는 any 타입으로 추론된다.
type u4 = unknown | any; // any 로 추론된다.
// any 는 어떤 타입과 union 을 해도 any 로 추론된다.
type a1 = any | number; // any 로 추론된다.
type a2 = any | string; // any 로 추론된다.
type a3 = any | boolean; // any 로 추론된다.

intersection 을 이용하는 경우

  • any 는 union 과 마찬가지로 어떤 타입과 intersection 을 해도 any 로 추론된다.
  • unknown 은 primitive 타입과 intersection 을 하면 type narrowing 이 일어나 해당 타입이 된다.
    • 단, any 와 intersection 했을 때는 이전과 마찬가지로 any 로 추론이 된다.
// unknown 타입에 intersection 을 이용하면 narrowing 이 되어 상대 타입이 된다.
type ui1 = unknown & string; // string 으로 추론된다.
type ui2 = unknown & boolean; // boolean 으로 추론된다.
type ui3 = unknown & number; // number 로 추론된다.
type ui4 = unknown & any; // any 로 추론된다.

// any 타입은 intersection 을 이용해도 그대로 any 타입이 된다.
type ai1 = any & number; // any 로 추론된다.
type ai2 = any & string; // any 로 추론된다.
type ai3 = any & boolean; // any 로 추론된다.

연산 기호 사용

  • any 는 어떤 연산 기호든 다 받아들인다.
  • 반면, unknown 은 사칙연산 연산자 기호 사용이 불가능하다.
    • 단, 동등성 비교는 가능하다.
let an1: any = 10;
let an2: any = 10;

// any 는 모든 사칙연산 연산자가 가능하다.
an1 + an2;
an1 - an2;
an1 * an2;
an1 / an2;

// 동등 비교 연산자에 대해서도 정상이다.
an1 === an2;
an1 == an2;
an1 !== an2;
an1 != an2;
// unknown 은 모든 사칙연산 연산자에 대해 에러가 난다.
un1 + un2;
un1 - un2;
un1 * un2;
un1 / un2;

// 동등 비교 연산자에 대해서는 정상이다.
un1 === un2;
un1 == un2;
un1 !== un2;
un1 != un2;
반응형
저작자표시 비영리 (새창열림)

'Typescript' 카테고리의 다른 글

TS020. 자바스크립트 배열의 문제점과 타입스크립트 배열의 특징  (0) 2023.12.30
TS019. 타입스크립트 never 타입  (0) 2023.12.30
TS017. 타입스크립트에서 Any 타입 사용의 문제점  (0) 2023.12.30
TS016. 타입스크립트 타입, 인터페이스 상속과 오버라이딩  (0) 2023.12.30
TS015. 타입스크립트에서 타입과 인터페이스의 차이  (0) 2023.12.30
    'Typescript' 카테고리의 다른 글
    • TS020. 자바스크립트 배열의 문제점과 타입스크립트 배열의 특징
    • TS019. 타입스크립트 never 타입
    • TS017. 타입스크립트에서 Any 타입 사용의 문제점
    • TS016. 타입스크립트 타입, 인터페이스 상속과 오버라이딩
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바