Typescript/개념

[Typescript] Type part 3 ( unknown / void / never )

개발자성장기 2022. 9. 21. 02:45
반응형

 

1) unknown

TypeScript 3.0에서 unknown 타입이 도입이 되었다.

unknown 타입은 단어의 뜻과 동일하게 '알 수 없다, 모른다'라는 의미를 가진다. 

unknown 타입은 any 타입과 동일하게 모든 값을 허용하지만, 할당된 값이 어떤 타입인지 모르기 때문에 함부로

프로퍼티나 연산을 할 수 없다. 

unknown 타입은 any와 마찬가지로 모든 타입의 값이 할당될 수 있다.
let variable: unknown

variable = true // OK (boolean)
variable = 1 // OK (number)
variable = 'string' // OK (string)
variable = {} // OK (object)

 

하지만 조금 다른 것은 unknown 타입으로 선언된 변수는 any를 제외한 다른 타입으로 선언된 변수에 할당될 수 없다는 것이다.
let variable: unknown

let anyType: any = variable
let booleanType: boolean = variable
// Error: Type 'unknown' is not assignable to type 'boolean'.(2322)
let numberType: number = variable
//  Error: Type 'unknown' is not assignable to type 'number'.(2322)
let stringType: string = variable
//  Error: Type 'unknown' is not assignable to type 'string'.(2322)
let objectType: object = variable
//  Error: Type 'unknown' is not assignable to type 'object'.(2322)

 

unknown은 typescript의 Top type이다. 따라서 typescript에 있는 모든 타입을 포함하여 어느 값이든 가질 수 있다. 

unknown을 사용하는 것은 컴파일러에게 ' 이 변수는 어떤 타입이될지 몰라 너가 추론해줘' 라고 이야기해주는 것과 같다.

하지만 이로인해 모든 타입이 공통적으로 할 수 있는 연산 외에는 할수 있는 것이 아무것도 없다.

따라서 unknown 타입 변수는 사용할 때 어떤 타입인지 다시 한번 명시를 해주어야 한다.

let myVar: unknown = 'hello';

// 이 변수의 타입은 unknown이므로 어떤 타입의 값이든 할당과 재할당이 가능
myVar = 42;

// 단, 다른 변수에 할당을 해주기 위해서는 타입을 명시해 줘야한다.
// **오류** myVar 변수의 타입이 명확하지 않으므로 number 타입 변수에 값 할당이 불가능
let age: number = myVar;

// unknown 타입 변수는 이렇게 사용할 때 타입을 명시해주어야 함
let age: number = (myVar as number);

 

unknown 타입 변수에 대해 타입 검사가 된 후에는 타입을 명시해주지 않아도 된다.
const flag: unknown = true;

if (flag === true) {
    // if 조건문에서 엄격한 비교를 통해 boolean 값인지 확인했으므로
    // 새 boolean 변수에 대입을 할 때에는 타입을 명시하지 않아도 됨
    const something: boolean = flag;
    
    // ...
}

 

 

unknown 타입으로 선언된 변수는 프로퍼티에 접근할 수 없으며, 메소드를 호출할 수 없으며, 인스턴스를 생성할 수도 없다. 
let variable: unknown

variable.foo.bar // Error: Object is of type 'unknown'.(2571)
variable[0] // Error
variable.trigger() // Error
variable() // Error
new variable() // Error

 

이렇게 unknown 은 any를 대체할 수 있다.  

대신 위 상황처럼 에러를 발생시켜 개발자가 타입을 한 번 더 확인하게 만든다. 

그리하여 any 타입에 비해 안정적인 애플리케이션을 개발할 수 있다.

 

 


void

 

void는 아무것도 return하지 않는 함수를 대상으로 사용한다. 

hello라는 함수를 만들고  보면 void라고 나오는 것을 볼 수 있다.

void는 따로 굳이 지정해줄 필요가 없다.

타입스크립트가 자동으로 return하지 않는 함수라고 인식하기 때문이다.

 

return console.log("hi") 도 void다 console.log는 return이 아니다.

 

 

 

 

never

 

이건 그렇게 많이 사용하진 않지만 무엇인지는 알아야한다.

never은 함수가 절대 return하지 않을 때 발생한다.

예를들면 함수에서 exception이 발생할 때이다.

function hello(): never {
  throw new Error("xxxx");
}

이건 return하지 않고 오류를 발생시키는 함수이다. 

이럴때 never를 사용한다. 

 

 

또한 never은 타입이 두 가지 일 수도 있는 상황에 발생할 수 있다. 

예를 들어 hello에서 name을 받고 이게 string이거나 number이라고 할때 발생할 수 도 있다.

 

function hello(name: string | number) {
  if (typeof name === "string") {
    name;
  } else if (typeof name === "number") {
    name;
  } else {
    name;
  }
}

 

제대로 인자가 전달되었다면  마지막 else까지 절대 오지 않는다.  그래서 never로 표기되어있다. 

 

 

 

source 

https://jbee.io/typescript/TS-9-unknown/

https://xo.dev/typescript-unknown-any-never/

반응형