TypeScript에서 any, unknown 및 object 유형은 서로 다른 시나리오에 적용되며 주요 차이점이 있습니다:
any: 변수에 대한 유형 검사를 비활성화합니다. 컴파일 오류 없이 변수로 무엇이든 할 수 있습니다. 객체의 유형이 미리 알려지지 않았고 안전성이 중요하지 않을 때 사용하십시오.unknown: 모든 유형을 동일하게 받을 수 있지만, 이러한 변수로 작업하려면 명시적인 유형 검증/변환이 필요합니다. any보다 안전합니다. 유형을 잃지 않기 위해 유형이 알려지지 않은 값에 사용하십시오.object: 원시값(숫자, 문자열)에는 해당되지 않는 비원시 객체(객체, 배열, 함수) 전용 유형입니다. 오직 객체 작업만 제한합니다.let a: any = 1; a = 'string'; // OK a(); // OK (하지만 런타임 시 오류를 일으킬 수 있습니다) let b: unknown = 'hello'; b = 5; // OK // b.toUpperCase(); // 오류 — 유형 검증이 필요합니다 if (typeof b === 'string') { console.log(b.toUpperCase()); } let c: object = { key: 'value' }; c = [1, 2, 3]; // OK // c = 1; // 오류, '1'은 객체가 아닙니다
질문: any를 사용할 수 있는데 unknown이 어떤 이점을 제공합니까?
답변: unknown은 코드의 안전성을 높입니다 — any와 같이 검증되지 않은 작업을 수행할 수 없습니다. 반드시 명시적으로 유형을 검증하거나 변환해야 하므로 런타임 중 많은 서프라이즈를 배제합니다.
function handle(value: unknown) { // value.trim(); // 오류 if (typeof value === 'string') { value.trim(); } }
이야기
프로젝트에서 외부 라이브러리를 신속하게 통합하기로 결정하고 유형을 신경 쓰지 않고 any로 결과를 설명했습니다. 결과적으로 런타임에서 라이브러리가 배열이 아닌 필드를 가진 객체를 반환하여 .map() 메소드의 오류가 대량으로 발생했습니다. 이 코드는 컴파일은 되었지만 실행 중에 실패했습니다.
이야기
한 개발자가 백엔드에서 온 데이터에 unknown을 사용했지만 필드 작업 전에 유형 검증을 추가하지 않았습니다. 결과적으로 TypeScript는 코드를 컴파일하지 못했고, 급히 any로 바꾸어 파싱 잠재적 오류를 숨겼으며 데이터 형식 오류로 인해 프로덕션에서 버그가 발생했습니다.
이야기
object 유형으로 작업하는 동안 혼란이 있었습니다. object 유형의 변수에 string 및 number 값을 할당하려고 했습니다. 개발 단계에서는 이슈를 인식하지 못했지만 리뷰 과정에서 원시값으로 객체 메소드가 작동하지 않는 것과 관련된 오류가 발견되었습니다. 수정하는 데 추가 시간이 소요되었습니다.