programing

downlevelIteration은 디폴트로 켜져 있지 않은 이유는 무엇입니까?

lastmoon 2023. 3. 13. 20:48
반응형

downlevelIteration은 디폴트로 켜져 있지 않은 이유는 무엇입니까?

스프레드 오퍼레이터를 이용하여 ES5를 타깃으로 하는 경우...환산하다Iterator에 대해서Array에러가 표시됩니다.-downlevelIteration컴파일러 옵션.일단 켜지면 확산 연산자는 완벽하게 작동하는 것처럼 보입니다.

왜 이걸 명시할 필요가 있을까요?tslib에서 출력된 생성 코드를 추가하는 것 외에 활성화 시 단점이나 제한이 있습니까?

또 다른 예는 다음과 같습니다.N의 어레이를 동적으로 작성합니다(예: 3).

[...Array(3).keys()]  // output: [0, 1, 2]

VS 코드에 다음 오류가 표시됩니다.
여기에 이미지 설명 입력

에러 메시지tsc:

'ItableIterator' 유형은 배열 형식이나 문자열 형식이 아닙니다.컴파일러 옵션 '--downlevelIteration'을 사용하여 반복을 허용합니다.

TypeScript Playground에서 코드 및 오류 편집 및 표시

릴리스 노트와 TypeScript의 ES3/ES5용 Downlevel Repeating 기사를 읽고 이 질문에 대한 답은 다음과 같습니다.downlevelIteration는 (설정을 통해) TypeScript가 호환성 코드 컴파일을 처리하는 방법을 결정해야 하기 때문에 비활성화됩니다(이전 버전의 Javascript를 지원).

이 문서에서 보다 장황한 설명을 통해 알 수 있듯이 TypeScript가 필요한 도우미 함수를 인라인화할지(단순하지만 프로덕션번들 사이즈가 커질 수 있음) 또는 TypeScript를 의존관계로 사용하여 외부 메서드를 호출할지를 결정해야 합니다.

자세한 내용은 TypeScript의 ES3/ES5용 Downlevel Repeation을 참조해 주십시오.또, 초기 문제에 대한 대체 솔루션도 참조해 주세요.

tl;dr: 사용자의 경우 사용Array.from(foo):

Array.from(Array(3).keys())

다운레벨링은 이전 버전의 JavaScript로 변환하는 TypeScript의 용어입니다.이 플래그는 오래된 JavaScript 런타임에서 새로운 개념을 통해 현대의 JavaScript가 어떻게 반복되는지 보다 정확하게 구현할 수 있도록 지원합니다.

ECMAScript 6은 몇 가지 새로운 반복 프리미티브를 추가했습니다.for / of루프(for (el of arr)어레이 확산([a, ...b]인수확산(fn(...args), 및Symbol.iterator.--downlevelIteration이러한 반복 프리미티브를 ES5 환경에서 보다 정확하게 사용할 수 있습니다.Symbol.iterator구현이 존재합니다.

이 질문에서는 어레이 확산에 관한 문제에 직면했으므로, 이 문제를 파헤쳐 봅시다.어레이의 범위를 다음에 나타냅니다.

// Make a new array who elements are 1 followed by the elements of arr2
const arr = [1, ...arr2];

설명에 따르면 ES5로 다운레벨을 설정하는 것은 쉬운 것 같습니다.

// The same, right?
const arr = [1].concat(arr2);

그러나 이는 일부 드문 경우에서 눈에 띄게 다릅니다.들어 있는 는 분산된 자체 하지만, 을 사용하여 구축한 .concat:

// Make an array where the '1' element is missing
let missing = [0, , 1];
let spreaded = [...missing];
let concated = [].concat(missing);
// true
"1" in spreaded;
// false
"1" in concated;

downlevelIterationSymbol.iterator(존재하는 경우) ES 6 동작을 보다 정확하게 에뮬레이트합니다.

자세한 정보 및 예:

이 경우 기본 범위를 생성하기 위해 이 동작을 변경할 필요는 없습니다.[...Array(3).keys()]할 수 Array.from(Array(3).keys())

tsconfig.json 파일에서 es5es6으로 변경하기만 하면 됩니다.여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/53441292/why-downleveliteration-is-not-on-by-default

반응형