[TypeScript] any , void, unknown

백광현·2022년 7월 27일
0
타입스크립트를 배우며 any, void, unknown, never가 정확히 무엇이고, 언제 사용하는지 잘 몰라 정리해보았다.

💡any

[대명사] 아무(것)

[한정사] 어느, 어떤

any type으로 선언한 변수에는 어떠한 값도 할당할 수 있습니다. 어떤 값이 할당 되는지 전혀 문제되지 않습니다 any로 선언했으니깐요. 기존의 javascript code에는 type system이 없기 때문에 이는 typescript code에 any를 덕지덕지 붙이는 것과 다름이 없습니다.

function stringToLowerCase(str: any) {
  return str.toLowerCase();
}

console.log(stringToLowerCase(1)); // str.toLowerCase is not a function
console.log(stringToLowerCase("TYPESCRIPT")); // typescript

stringToLowerCase 함수는 매개변수로 받은 값을 문자열 메소드인 toLowerCase를 호출해 return하고 있는데, 숫자값을 인자로 넘겨주게 되면 에러가 나오게 된다. str을 any로 넣어 string 이외의 타입도 넣을수 있지만 에러가 발생되게 된다.

typescript를 사용한다면 any사용하는 것을 지양해야 하며, 외부 API를 사용하는 경우 응답 데이터를 참고하여 type을 만들어 type assertion을 하거나, JSON.parse 처럼 불특정 객체 역시 type을 지정해주는 것이 좋다

어쩃든 any를 모든 변수의 타입으로 사용할 수 있고, 대신 그로인해 발생하는 runtime error는 어쩔수 없다!


💡unknown

any 사용을 지양해야한다 했지만 개발을 하다보면 stringToLowerCase의 매개변수의 타입을 정말 모르는 경우가 있다. 그럼에도 우리는 stringToLowerCase 함수를 작성해야 합니다. 이런 경우, 우리는 변수의 type check를 typescript가 아닌 개발자가 하게 만들 수 있습니다.

어쨋든 stringToLowerCase함수는 만들어야 하고 매개변수 타입을 모르겠고, 대신 runtime error는 피해야 겠고...우리가 코드상에서 직접 타입검사를 해줘야 겠습니다. 그러면 이 경우 매개변수 타입은 뭘 해야 할까요? any는 아니고, string ?, 근데 string type이 아닌 변수도 매개변수로 받을 수 있습니다.

위의 경우 매개변수의 type을 unknwon로 할 수 있습니다.

[형용사] 알려지지 않은

[명사] 미지의 것

function stringToLowerCase(str: unknown) {
  return str.toLowerCase(); // Object is of type 'unknown'.
}

str은 unknown type으로 잡으면 에러가 나옵니다. 이유는 toLowerCase는 문자열에 있는 메소드 이기 때문에 str의 type이 정확하지 않아 에러가 나오게 됩니다.

function stringToLowerCase(str: unknown) {
  if (typeof str === "string") {
    return str.toLowerCase(); 
  }
  
  or
  
   const string = str as string;
   return string.toLocaleLowerCase();
}

console.log(stringToLowerCase("TYPESCRIPT")); // typescript

또한 unknown type으로 선언한 변수에는 모든 type의 값을 할당 할 수 있지만 unknown type의 변수는 unknown, any를 제외한 다른 type의 변수에 할당할 수 없다.

💡void


void는 전혀 어떤값을 가지지 않는 것을 의미합니다. 아마도 어떤값도 return하지 않는 함수의 reutrn type으로 종종 보았을 것입니다.

function print(str: string): void {
  console.log(str);
}

그리고 void 타입으로 변수를 선언하는 것은 딱히 유용하지 않은데, 왜냐하면 void 타입의 변수에는 null와 undefined밖에 할당하지 못하기 때문입니다. 단, --strictNullChecks 옵션이 없을때만 null를 할당할 수 있습니다.

0개의 댓글