<span style={color: "red"}>주의할 점이 더 많은..
타입 에러를 없애줄 뿐 런타임 에러를 막아주지는 않는다. 오히려 컴파일 타임에 잡을 수 있는 에러를 무시하여 예방 가능했던 런타임 에러를 발생시킬 수 있다.
타입스크립트를 사용하는 근본적인 이유는 런타임에 발생할 에러를 컴파일 과정에서 걸러내기 위함인데 타입 단언을 무분별하게 사용하는 것은 의도에 반하는 행동이다.
타입 검사를 생략하더라도 문제가 생길 일이 없다고 확신할 수 있을 때만 사용해야 한다.
변수나 프로퍼티명 뒤에 느낌표(!)를 붙여서 컴파일러의 검사를 건너뛰게 할 수 있다.
컴파일러가 가진 정보를 모두 무시하고 value
를 Type
타입의 값이라 생각하고 실행하도록 강제하는 방식이다.
interface Dog {
legs: 4;
bark(): void;
}
interface Insect {
legs: number;
creepy: boolean;
}
interface Fish {
swim(): void;
}
type Animal = Dog | Insect | Fish;
function doSomethingWithAnimal(animal: Animal) {
(animal as Fish).swim();
// animal 변수의 타입을 Fish로 단언한다.
// 원래대로라면 Dog와 Insect를 고려하여 타입 에러가 발생했겠지만
// 타입 단언으로 인해 타입 에러없이 컴파일된다.
// 런타임에 `Dog` 혹은 `Insect` 값을 받으면 에러가 발생한다.
}
any 타입을 이용하면 특정 값에 대한 타입 검사를 무효화할 수 있다.
어쩔 수 없는 경우를 제외하고 사용을 자제한다.
아래 코드는 타입 단언을 이용해 타입 에러를 피해갔지만 런타임 에러가 발생하게 된다.
(3 as any).substr(0, 3);
타입 단언은 여러번 겹쳐 사용할 수 있다.
호환되지 않는 것이 명백한 타입으로의 단언을 가능하게 하는 문법이다.
잘 읽고갑니다!!