프로그래밍TypeScript 개발자

TypeScript에서 변수의 유형 지정을 위한 typeof 연산자의 역할과 메커니즘을 설명하십시오. 변수가나 객체 구조의 유형을 추론하기 위해 사용하는 방법과 수동으로 유형을 지정하는 것이 덜 선호되는 경우는 어떤 경우입니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

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;}

주요 특징:

  • TS의 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 인터페이스 유형 생성을 위한 경우.

장점: 유형이 항상 값과 일치하고 오류 가능성이 낮으며 좋은 자동 완성 제공

단점: 객체가 매우 복잡한 경우 최종 유형이 초보자에게 읽기 어렵게 될 수 있음