-
any와 unknown, union(TS)카테고리 없음 2023. 12. 19. 19:16
어쩔수 없는 가변적인 타입의 데이터를 저장하고 싶다면
ANY보다는 UNKNNWON을 쓰는게 좋다.
ANY - UNKNOWN은 어떠한 타입이 올지 모르겠다면
그때 쓴다.
ANY 타입
ANY타입은 모든 타입에 사용가능한 슈퍼 타입
어떠한 타입이든 저장이 가능하다
let anything: any;
anything = 5; // 최초에는 숫자를 넣었지만
anything = 'Hello'; // 문자열도 들어가고요
anything = { id: 1, name: 'John' }; // JSON도 들어가네요정말 아무거나 들어갈 수 있는 그런 타입으로 쓰인다.
즉, 넘버도 스트링도모두 들어간다
이게 아니었다면 에러가 났을 것이다.
정말 어쩔 수 없이 써야할 때
예를들면 RDB같은 포맷은 스키마에 맞게 들어오는데
NOSQL은 관계형이 아니기에 가변적인 데이터를 다루는데
그럴때 사용가능하다.
TS은 타입의 안정성을 확보하기 위함인데
ANY을 쓰는게 맞나요?
ANY는 코드의 안정성을 떨어뜨리니 가급적 사용금지
UNKNOWN
그럴 때 쓰이는 타입
모든 타입을 저장가능하다
그러나 명시적으로 나타내야한다.
let unknownValue: unknown = '나는 문자열이지롱!';
console.log(unknownValue); // 나는 문자열이지롱!
let stringValue: string;
stringValue = unknownValue; // 에러 발생! unknownValue가 string임이 보장이 안되기 때문!
stringValue = unknownValue as string;
console.log(stringValue); // 나는 문자열이지롱!stringValue = unknownValue as string; 이런식으로 타입은 스트링이다고 단언을 해준다.
let unknownValue: unknown = '나는 문자열이지롱!';
let stringValue: string;
if (typeof unknownValue === 'string') {
stringValue = unknownValue;
console.log('unknownValue는 문자열이네요~');
} else {
console.log('unknownValue는 문자열이 아니었습니다~');
}이런식으로 단언하지 않아도 가능은하다.
타입단언(AS TYPE)이 정답은아니지만
그래도 단언해주는게 좋다.
UNION
언노운은 단언은 할 수 있지만 가변성이기에 안정성이 떨어지고 그럴때 UNION을 사용한다.
그렇게 되면 UNION으로 선언해주면 불변성을 갖는다
type StringOrNumber = string | number; // 원한다면 | boolean 이런식으로 타입 추가가 가능해요!
function processValue(value: StringOrNumber) {
if (typeof value === 'string') {
// value는 여기서 string 타입으로 간주됩니다.
console.log('String value:', value);
} else if (typeof value === 'number') {
// value는 여기서 number 타입으로 간주되구요!
console.log('Number value:', value);
}
}
processValue('Hello'); //스트링이나온다.
processValue(42); // 넘버가 나온다.이런식으로 타입을 지정해주면 스트링값을 넣으면 타입이 스트링, 넘버를 넣어주면 넘버가 나오고 타입은 변하지 않는다.
이렇게 넘버아니면 숫자다 이런식으로 사용을하면
그 두값만 받을수 잇는 함수를 선언한 것이다.