programing

TypeScript에서 Emplicit이 없을 때 빈 배열이 "any[]"로 유추되는 이유는 무엇입니까?거짓일 때 "절대[]가 아니다"라고 추론되는 것은 사실입니까?

muds 2023. 6. 15. 22:09
반응형

TypeScript에서 Emplicit이 없을 때 빈 배열이 "any[]"로 유추되는 이유는 무엇입니까?거짓일 때 "절대[]가 아니다"라고 추론되는 것은 사실입니까?

let a = [];
a.push(0);

위의 코드는 다음과 같은 경우에 정상적으로 컴파일됩니다.

  1. 둘다요.noImplicitAny그리고.strictNullChecks는 참이 되도록 되어 있습니다.
  2. 둘다요.noImplicitAny그리고.strictNullChecksfalse false로 됩니다.

그러나 다음과 같은 경우 두 번째 줄에 오류가 발생합니다.

  1. noImplicitAny이고 거이고짓입니다.strictNullChecks사실입니다

발생된 오류는 다음과 같습니다.Argument of type 'number' is not assignable to parameter of type 'never'.

처음 두 건의 경우에 따라a는 로추되있습다니로 되고 있습니다.any[]그리고 마지막 경우에는 그것이 추론됩니다.never[] 왜 이 일어날까요하지만 왜 이런 일이 일어날까요?한다면noImplicitAny거짓입니다, 여전히 추론할 수 있어야 하지 않을까요?any[]반대로, 왜 그것이 추론되고 있습니까?any[] noImplicitAny든 뒤바뀐 것 ...예상했던 행동들이 어떻게든 뒤바뀐 것 같습니다...

아래 첨부된 이미지에서 사용된 오류 및 옵션을 확인하십시오.

처음 두 경우:

마지막 사례:

이 문제는 Microsoft/TypeScript #36987에서 발생했습니다.여기서 권위적인(특히 유용한 것은 아님) 답변은 이 동작이 의도한 대로이며 이전 버전과의 호환성을 위해 필요하다는 것입니다.일반적으로 TypeScript를 사용하면 변경사항이 깨지는 것보다 더 많은 것을 개선하지 않는 한 변경사항이 깨지지 않습니다.


컴파일러 옵션과 컴파일러 옵션이 모두 활성화된 경우 빈 배열은 실제로 유형이 아닙니다.any[]대신 "자동", "자동" 또는 "자동" 유형이 추가되는 것으로 관찰되는 값에 따라 변경됩니다.이는 Microsoft/TypeScript#11432에서 구현됩니다.

let a = []; // auto-typed
a.push(0); // now a is seen as number[]
a.map(x => x.toFixed()) // okay
a.map(x => x.toUpperCase()) // error, numbers don't have a toUpperCase() method

--noImplicitAny. 수입니다. ( 해제, 이발지않습다니하생는,않다습니if지해▁is▁which제▁doing발▁code).). 그렇게 하면 "괜찮다"던 기존 코드에 새로운 오류를 추가했을 것이기 때문입니다(만약 그렇다면).a이 형의입니다.any[],그리고나서x에 시대에map()메서드는 유형이어야 합니다.any 따서오류발않합니다아야지생하라에 오류가 발생하지 않아야 합니다.x.toUpperCase() 또같은 오타는타와 같은 .x.toFaxed()또는 기타).


대는서해에의 는.--strictNullChecks활성화 또는 비활성화 상태에서 빈 어레이 리터럴이 다른 사용 사례와 상호 작용하는 것과 관련된 몇 가지 버그 수정이 있었습니다. Microsoft/TypeScript #19576Microsoft/TypeScript #19745참조하십시오.이러한 수정은 다음과 같은 경우 동작을 변경했습니다.--strictNullChecks이 설정되어 있지만 해제되어 있지 않은 경우에는 이러한 다른 사용 사례에서 이전 버전과의 호환성을 유지하기 위해 다시 설정됩니다.


그래서 그것이 어느 정도 진행되고 있는 것입니다.특정 컴파일러 옵션과 관련하여 여러 기능과 버그 수정이 고유한 방식으로 상호 작용하는 결과를 볼 수 있습니다.

실용적으로 말하면 가능한 경우 항상 전체 컴파일러 옵션을 사용해야 합니다.이는 "표준" 수준의 유형 안전을 제공하며 광범위하게 사용되므로 커뮤니티에서 많은 양의 문서화 및 토론이 이루어집니다.일부 컴파일러 옵션을 선택적으로 사용하지 않도록 설정한 경우 이상하거나 예기치 않은 상황이 발생하면 사용할 수 있는 리소스가 더 적어집니다. 이러한 구성을 가진 소수의 사용자 중 하나일 수 있기 때문입니다.그리고 만약 당신이 진짜 언어 버그를 발견하더라도, 그것이 고쳐져야 하는 압력이 줄어들 것이고, 그래서 그것은 오랫동안 또는 영원히 지속될 수 있습니다.

코드에 대한 놀이터 링크

이는 여기에서 관찰할 수 있는 의도된 동작입니다.

대부분 하위 호환성과 관련이 있습니다.주요 요점은 이 노선들을 따라가는 것입니다.

  • 배열의 유형은 실제로는undefined[]로 확대되는 것.any[]
  • 그러나 언제strictNullChecks그렇다면 사실입니다.undefined옵션이 아니므로 다음으로 업데이트됩니다.never[]

언급URL : https://stackoverflow.com/questions/72659865/in-typescript-why-is-an-empty-array-inferred-as-any-when-noimplicitany-is-t

반응형