타입 단언이라 불리는 Type Assertion은 타입을 강제적으로 지정해 주는 것을 말한다.
여기서 타입 캐스팅과 다르다는 점을 인식하고 있어야 한다.
타입 단언은 as 키워드를 이용해서 정의할 수 있다.
// name이라는 변수의 타입은 string이라고 정의
const name: string = 'Capt';
// 위 코드에 Type assertion을 적용
const name = 'Capt' as string;
타입 단언은 타입스크립트 컴파일러보다 개발자가 해당 타입을 더 잘 알고 있을 때 사용한다.
또는, 자바스크립트 기반 코드에 점진적으로 타입스크립트를 적용할 때도 자주 사용된다.
// 타입 정의
interface Hero {
name: string;
age: number;
}
// app.js
cons capt = {};
capt.name = '캡틴';
capt.age = 100;
const capt: Hero = {}; // 오류 발생
// as 키워드로 해결!
const capt = {} as Hero; // 오류가 발생하지 않음
capt.name = '캡틴';
capt.age = 100;
let x = "1";
// error: 'string' 형식을 'number' 형식으로 변환한 작업은 실수일 수 있다.
// (두 형식이 서로 충분히 겹치지 않기 때문)
// 의도적으로 변환한 경우에는 먼저 'unknown'으로 식을 변환한다.
let y: number = x as number; // Error
let z: number (<any>x) as number; // any 또는 unknown으로 변환 후, 다시 한 번 타입을 변환한다.
위 예제를 보면 y 변수에서 에러가 발생하는데,
Type Assertion의 규칙은 ‘보다 구체적인 또는 덜 구체적인’ 버전의 타입으로 변환하는 행위만 허용된다.
즉, y 변수를 해결하려면 any
나 unknown
으로 먼저 변환한 다음
z 처럼 다시 한 번 변환을 시켜줘야 한다.