interface User {
email: string;
}
const vi: User = {email: 'aaa@aaa.com'} // 타입 선언
// 선언하면 먼저 컴파일러가 이상이 없는지 판단해준다.
const jinx = {email: 'bbb@bbb.com'} as User // 타입 표명
// 표명을 하면 내가 이 변수는 어떤 타입이라고 컴파일러에게 알려준다.
// 타입 선언 방식이 더 효율적이고 일반적이다.
const a: User = {} // error
const b = {} as User // 에러가 발생하지 않음.
const c: User = {
email: 'ccc@ccc.com',
isActive: false
} // error
const d = {
email: 'ddd@ddd.com',
isActive: false
} as User; // 에러가 발생하지 않음.
// 이런 경우에는 타입 표명을 쓴다.
// <input type='text' id='email' />
const el = document.getElementById('email');
el?.value // error 발생
// HTMLElement라는 타입을 반환해 주는데, 이 타입에는 value라는 속성이 없다.
// HTMLElement 하위에 HTMLInputElement가 있고 이 타입에는 value라는 속성이 있다.
// 컴파일러는 어떤 타입인지 정확히 모른다 HTMLElement인지, HTMLInputElement인지.
// 이 경우 코드를 작성하는 사람이 어떤 타입인지 알고 있으므로 타입 표명을 쓰면 좋다.
const el2 = document.getElementById('email') as HTMLInputElement;
el2?.value // 에러가 발생하지 않음.
되도록이면 타입 선언을 쓰되, 후자의 경우에는 타입 표명을 써도 좋다.