객체가 아닌 null과 undefined를 제외한 모든 값을 의미합니다
let anyValue: {} = 42; // number
anyValue = "hello"; // string
anyValue = true; // boolean
anyValue = { name: "Alice" }; // object
anyValue = [1, 2, 3]; // array
anyValue = null; // 오류: null은 `{}` 타입에 할당할 수 없음
anyValue = undefined; // 오류: undefined는 `{}` 타입에 할당할 수 없음
대체로 {} 타입을 사용하는 대신, unknown이나 any 타입을 더 많이 사용했습니다 이들은 {}보다 더 유연하고 명확한 동작을 제공하고 다른 동료가 봤을때도 문제를 가지지 않았습니다.
{}와 object 타입의 차이:
{} 타입은 모든 타입의 값을 허용하지만, object 타입은 객체로 취급할 수 있는 타입만을 허용 object는 원시 타입(number, string, boolean 등)은 허용하지 않고, 배열이나 객체와 같은 참조 타입만을 허용
let obj: object = {}; // 객체 obj = [1, 2, 3]; // 배열도 허용 // 위에 코드와 대조적인 상황 let primitive: object = 42; // 오류: 'number'는 'object' 타입에 할당 불가 primitive = "hello"; // 오류: 'string'은 'object' 타입에 할당 불가
any 타입의 값을 포함해 어떤 값도 가질 수 없다. 그래서 never 타입은 때때로 점유할 수 없는 또는 바닥 타입이라고 불린다.즉 어떠한 타입도 대입 불가하다.
불가능 하다가 TS에서 필요하다고 한다. 수학에서 0이 필요한거 같이 필요하다고 한다.
undefined, null, void 으로는 불가능을 나타낼 수 없기에 사용한다.
TS 불가능이라는 뜻 (아래 4가지)
- 어떤 값도 가질 수 없는 빈 타입
- 제네릭 및 함수에서 허용되지 않는 파라미터
- 호환 되지 않는 타입 교차
- 빈 유니언 타입 (유니언 했지만 아무것도 안되는 경우)
// 허용할 수 없는 함수 매개변수에 제한을 가한다.
function unknownColor(x: never): never {
throw new Error("unknown color");
}
type Color = 'red' | 'green' | 'blue'
function getColorName(c: Color): string {
switch(c) {
case 'red':
return 'is red';
case 'green':
return 'is green';
default:
return unknownColor(c); // 'string' 타입은 'never' 타입에 할당할 수 없음
}
}
never VS void의 차이:
void는 함수가 값을 반환하지 않는 경우를 의미합니다. 하지만 함수는 정상적으로 종료됩니다. void는 주로 return이 없는 함수에서 사용됩니다.
function logMessage(message: string): void { console.log(message); }
never는 결코 값을 반환하지 않는 경우를 의미하며, 함수가 정상적으로 종료되지 않거나, 도달하지 않는 코드입니다. never는 함수가 무한 루프에 빠지거나 예외를 던지는 상황에서 사용됩니다.
타입스크립트 교과서 (조현영 지음) 타입스크립트 교과서 구매링크