TypeScript는 실행 시간에만 사용할 수 있는 typeof 연산자를 지원할 뿐만 아니라, 컴파일 단계에서도 표현식의 유형을 추론하는 데 사용할 수 있습니다. 이를 통해 이미 선언된 변수, 함수 또는 객체 구조의 유형을 가져올 수 있으며, 유연한 유형 지정을 가능하게 하고 유형의 중복 및 비동기화 가능성을 줄입니다.
원래 JavaScript에서 typeof 연산자는 런타임에서 값의 유형을 결정하는 데 사용되었습니다. TypeScript는 이 메커니즘을 확장하여, 이제 typeof는 컴파일 단계에서 변수나 함수의 결과 유형에 대한 참조를 생성합니다. 이는 복잡한 구조, 구성 파일 작업 및 모듈 간의 유형 재사용 시 매우 유용합니다.
수동으로 유형을 선언할 때 실수를 저지르기 쉽습니다: 구조 정의를 변경하고 유형 또는 인터페이스 선언을 업데이트하는 것을 잊거나 객체 간의 유형을 잘못 복사하는 경우 등입니다. 이는 코드 비동기화 및 실행 오류를 초래합니다. typeof를 사용하면 유형이 동적으로 출력되며 항상 데이터 구조와 일치합니다.
이미 존재하는 구조나 상수에 해당하는 유형으로 변수를 선언하기 위해 typeof 연산자를 사용합니다:
const config = { host: "localhost", port: 8080, }; let serverCfg: typeof config; // serverCfg의 유형은 config와 동일합니다.
특정 구조를 반환하는 함수를 유형화할 때:
function makeUser() { return { id: 1, name: "Alex" }; } type User = ReturnType<typeof makeUser>; // User: {id: number; name: string;}
주요 특징:
typeof는 컴파일 단계에서 변수나 표현식의 유형을 반환합니다.ReturnType, Parameters)과 결합하거나 keyof와 함께 사용하여 객체의 키 목록을 가져옵니다.TypeScript의 typeof 연산자는 실행 단계에서 실행되나요?
아니요, 타입 typeof는 컴파일 시에만 작동하며 런타임 코드에는 포함되지 않습니다. 하지만 JavaScript의 typeof 연산자는 런타임에서도 존재합니다.
typeof를 클래스 속성의 유형을 추론하는 데 사용할 수 있습니까?
네, 하지만 속성이 정적이거나 초기 값이 있는 경우에만 가능합니다. private/public protected의 경우 공개 속성/메서드만 고려됩니다.
'let x: typeof y;'와 'let x = y;' 사이에 차이가 있습니까?
유형 측면에서 보면 두 경우 모두 컴파일러가 자동으로 유형을 추론합니다. 그러나 'typeof'는 초기화 없이도 유형 선언을 작성하거나 유틸리티 유형과 더 복잡한 조합으로 작성하는 데 사용될 수 있습니다.
typeof를 일반적인 js 유형 검사(typeof x === 'string')에 사용하는 것은 런타임 검사이며 컴파일 가능한 유형이 아닙니다.프로젝트에서 큰 애플리케이션 설정 객체가 유형으로 별도로 설명되고 변수로 별도로 설명됩니다. 구조가 변경될 경우 유형을 업데이트하는 것을 잊어 API 오류를 유발합니다.
장점: 유형과 함께 작업하는 유연함, 유형을 type 또는 interface를 통해 재정의할 수 있음
단점: 구조와 유형이 비동기화될 위험이 크고 유지 보수가 좋지 않음
새로운 변수를 선언할 때 객체 구조의 현재 유형을 얻기 위해 typeof를 사용하는 것과 API 인터페이스 유형 생성을 위한 경우.
장점: 유형이 항상 값과 일치하고 오류 가능성이 낮으며 좋은 자동 완성 제공
단점: 객체가 매우 복잡한 경우 최종 유형이 초보자에게 읽기 어렵게 될 수 있음