>  Q&A  >  본문

정의되지 않은 배열 요소가 반환될 가능성을 고려하지 않는 Typescript 코드

<p>다음 코드는 Typescript 유형 검사기(v2.9.1)를 통과하지만 런타임에 <code>TypeError</code>를 발생시킵니다. </p> <pre class="brush:php;toolbar:false;">인터페이스 항목 { ID: 문자열 } const 목록: 항목[] = [{ id: 'a' }, { id: 'b' }]; const item = list[3]; // 유형: 항목 const itemId = item.id // 유형: 문자열</pre> <p>형식 있는 배열의 요소에 액세스하면 항상 <code>정의되지 않은</code>가 반환될 수 있다는 점을 고려하면 <code>item</code>은 <code>item: Item | , 이로 인해 null 검사를 수행해야 하지 않습니까? </p> <p>저를 더욱 놀라게 한 것은 다음 코드도 유형 검사를 통과했다는 것입니다. </p> <pre class="brush:php;toolbar:false;">const item2: 항목 | 정의되지 않음 = 목록[3]; const item2Id = item2.id;</pre> <p>반환 값을 캐스팅하면 유형 확인이 실패하지만: </p> <pre class="brush:php;toolbar:false;">const item3 = list[3] as Item | const item3Id = item3.id; // [ts] 객체가 '정의되지 않은' 것일 수 있습니다.</pre> <p>명시적으로 유형이 지정된 접근자 함수를 생성하면 <code>정의되지 않은</code> 상황을 포착할 수도 있지만 불필요한 오버헤드가 추가됩니다. </p> <pre class="brush:php;toolbar:false;">const getItem1 = (색인: 번호, 항목: 항목[]): 항목 정의되지 않음 => const item3 = getItem1(3, 목록); const item3Id = item3 && item3.id;</pre> <p>이것이 Typescript의 알려진 제한사항인가요? 이 상황을 처리하기 위해 권장되는 패턴이나 라이브러리가 있습니까? </p>
P粉824889650P粉824889650423일 전606

모든 응답(2)나는 대답할 것이다

  • P粉194541072

    P粉1945410722023-08-25 11:31:36

    이것은 의도적인 동작입니다. TypeScript GitHub 저장소에서 이 문제에 대한 긴 토론을 확인하세요

    strictNullChecks이(가) 닫혀 있습니다. 열어보세요.

    회신하다
    0
  • P粉330232096

    P粉3302320962023-08-25 11:19:47

    TS 4.1 업데이트:

    TypeScript 4.1에는 --noUncheckedIndexedAccess编译器标志,实现了在microsoft/TypeScript#13778中提出的建议,以考虑这种情况下的undefined。请注意,该功能不会作为--strict编译选项集的一部分启用,并且被称为“严格的索引签名”,因为它会在程序员可能不希望或期望的情况下发出关于undefined 경고가 도입되었습니다.


    TS4.1 이전 답변:

    인덱스 서명은 선택적 속성처럼 요소 유형에 | undefined를 추가하지 않는다는 것을 발견했습니다. microsoft/TypeScript#13778에서 이를 달성하기 위해 컴파일러 옵션을 생성하라는 제안이 있었습니다. 해당 제안의 의견을 읽을 수 있습니다. 다른 질문과 연결되어 있지만 오류율이 높기 때문에 거의 쓸모가 없다는 데 동의합니다.

    에서는 요소 유형에 | undefined를 수동으로 추가할 수 있다고 언급합니다.

    으아악

    전체 언어에 영향을 주지 않고 예상대로 작동합니다.

    회신하다
    0
  • 취소회신하다