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
'Typescript > 개념' 카테고리의 다른 글
[Typescript] 4. Class and Interfaces (1) | 2022.09.27 |
---|---|
[Typescript] call signatures // overloading (0) | 2022.09.22 |
[Typescript] Type part 2 ( readonly / Tuple / any ) (1) | 2022.09.21 |
[Typescript] 타입 - 1 (0) | 2022.09.20 |
[Typescript] Typescrip를 사용하는 방법 (1) 기초편 (1) | 2022.09.19 |