정의되지 않은 배열 요소가 반환될 가능성을 고려하지 않는 Typescript 코드
P粉824889650
2023-08-24 12:15:44
<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>
이것은 의도적인 동작입니다. TypeScript GitHub 저장소에서 이 문제에 대한 긴 토론을 확인하세요
strictNullChecks
이(가) 닫혀 있습니다. 열어보세요.TS 4.1 업데이트:
TypeScript 4.1에는
--noUncheckedIndexedAccess
编译器标志,实现了在microsoft/TypeScript#13778中提出的建议,以考虑这种情况下的undefined
。请注意,该功能不会作为--strict
编译选项集的一部分启用,并且被称为“严格的索引签名”,因为它会在程序员可能不希望或期望的情况下发出关于undefined
경고가 도입되었습니다.TS4.1 이전 답변:
인덱스 서명은 선택적 속성처럼 요소 유형에
| undefined
를 추가하지 않는다는 것을 발견했습니다. microsoft/TypeScript#13778에서 이를 달성하기 위해 컴파일러 옵션을 생성하라는 제안이 있었습니다. 해당 제안의 의견을 읽을 수 있습니다. 다른 질문과 연결되어 있지만 오류율이 높기 때문에 거의 쓸모가 없다는 데 동의합니다.에서는 요소 유형에
으아악| undefined
를 수동으로 추가할 수 있다고 언급합니다.전체 언어에 영향을 주지 않고 예상대로 작동합니다.