오늘은 타입을 미리 정하기 애매할 때 사용하는 타입에 대해 알아보도록 하겠습니다.
let members: (number | string)[] = [1, "2", 3];
let objects: { a: number | string } = { a: 123 };
let nickname: any;
nickname = 123;
nickname = [];
unknown 이라는 것도 있는데, any 와 유사하지만 any 보다 조금 더 안전한데, 아래와 같이 array 를 string 에 대입하려고 할 때 오류를 발생시킵니다. 반면에, any 는 오류가 발생하지 않습니다.
let nickname: unknown;
nickname = 123;
nickname = [];
let a: string = nickname; // 에러 발생
타입스크립트는 엄격한 언어입니다. 다음과 같이 union type 으로 지정했는데, 초기화를 해서 타입이 확정되지 않으면 에러가 발생합니다. string 이어도 +1 연산이 가능하고, number 이어도 +1 연산이 가능하기 때문입니다.
let age: string | number;
age + 1; // 에러 발생
let age: number | string = 1;
age + 1; // 정상
let age: string;
age + 1; // 정상
let age: number;
age + 1; // 정상
let age: unknown = 1;
age + 1; // 에러 발생
연습으로, 다음 변수 4개에 타입을 지정해봅시다. (단, age 변수엔 undefined 말고도 숫자도 들어올 수 있습니다.)
// 타입 지정 전
let user = 'kim';
let age = undefined;
let married = false;
let 철수 = [user, age, married];
// 타입 지정 후
let user: string = "kim";
let age: undefined | number = undefined;
let married: boolean = false;
let 철수: (string | undefined | number | boolean)[] = [user, age, married];
학교라는 변수에 타입도 지정해봅시다.
// 타입 지정 전
let 학교 = {
score : [100, 97, 84],
teacher : 'Phil',
friend : 'John'
}
학교.score[4] = false;
학교.friend = ['Lee' , 학교.teacher]
// 타입 지정 후
let 학교: {
score: (number | boolean)[];
teacher: string;
friend: string | string[];
} = {
score: [100, 97, 84],
teacher: "Phil",
friend: "John",
};
학교.score[4] = false;
학교.friend = ["Lee", 학교.teacher];
unknown 타입인 변수를 조작하려면 내가 조작할 변수의 타입이 무엇인지 확실하게 체크하는 narrowing 또는 assertion 스킬을 사용해야 합니다. 이는 다음에 알아보도록 하겠습니다.