TypeScript에서 as
키워드 사용하기
TypeScript에서 as
키워드를 사용하여 타입을 명시적으로 지정해야 하는 경우는 여러 가지가 있는데 주요 상황들은 아래와 같다.
1. 타입 단언(Type Assertion)이 필요한 경우
TypeScript가 추론한 타입보다 개발자가 더 구체적인 타입을 알고 있을 때 사용.
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
2. 유니온 타입을 더 구체적인 타입으로 좁힐 때
function getLength(obj: string | string[]) {
if (typeof obj === 'string') {
return (obj as string).length;
} else {
return obj.length;
}
}
3. 객체 리터럴에서 추가 프로퍼티를 허용할 때
interface Options { width: number; height: number; }
let config = { width: 100, height: 100, color: "red" } as Options;
이 경우, as
를 사용하면 인터페이스에 정의되지 않은 추가 프로퍼티(color
)를 포함. 하지만 이 방법은 TypeScript의 타입 체크를 우회하므로 주의가 필요.
더 안전한 대안으로는 인터페이스 확장이나 인덱스 시그니처 사용이 있다:
// 인터페이스 확장
interface ColoredOptions extends Options {
color?: string;
}
// 인덱스 시그니처 사용
interface FlexibleOptions extends Options {
[key: string]: any;
}
4. 외부 라이브러리나 API의 반환 타입이 불명확할 때
const result = someExternalFunction() as SomeSpecificType;
5. null이나 undefined가 아님을 확신할 때 (non-null assertion)
const element = document.getElementById('myElement') as HTMLElement;
// 대신 '!' 를 사용할 수도 있습니다: document.getElementById('myElement')!
6. 제네릭 타입을 구체화할 때
function create<T>(Factory: { new(): T }): T {
return new Factory();
}
class Car {}
const car = create(Car as { new(): Car });
7. 객체의 인덱스 시그니처를 더 구체적으로 지정할 때
interface NumberDictionary {
[key: string]: number;
length: number;
}
const myDict = {} as NumberDictionary;
주의사항
as
키워드는 TypeScript의 타입 체크를 우회하므로 신중하게 사용해야 함.- 가능하면 타입 가드나 타입 좁히기(type narrowing) 등의 더 안전한 방법을 먼저 고려하는게 좋음.
- 잘못 사용하면 런타임 오류의 위험이 있으므로, 확실할 때만 사용해야 함.
as
사용은 때때로 필요하지만, 과도한 사용은 코드의 타입 안정성을 저해할 수 있고 가능한 TypeScript의 타입 추론과 타입 체크 기능을 최대한 활용하는 것이 좋다.