TypeScript에서는 다양한 열거형이 어떻게 동작합니까?
TypeScript에는 열거형을 정의하는 다양한 방법이 있습니다.
enum Alpha { X, Y, Z }
const enum Beta { X, Y, Z }
declare enum Gamma { X, Y, Z }
declare const enum Delta { X, Y, Z }
에서 Gamma
합니다.Gamma
이 는 그렇지 .Delta
★★★★★★★★★★★★★★★★★」Alpha
?가 뭐죠?const
★★★★★★★★★★★★★★★★★」declare
기기 있있 언언 언? ?? ???
'아주머니'라는 것도 있어요.preserveConstEnums
컴파일러 플래그 - 이 플래그와 이러한 플래그는 어떻게 상호 작용합니까?
TypeScript enum에는 4가지 측면이 있습니다.먼저, 몇 가지 정의를 제시하겠습니다.
"오브젝트 표시"
이 열거형을 쓰는 경우:
enum Foo { X, Y }
TypeScript는 다음 개체를 내보냅니다.
var Foo;
(function (Foo) {
Foo[Foo["X"] = 0] = "X";
Foo[Foo["Y"] = 1] = "Y";
})(Foo || (Foo = {}));
이것을 룩업 오브젝트라고 합니다.그 목적은 두 가지입니다: 문자열에서 숫자로의 매핑(예: 쓰기) 역할을 하는 것입니다.Foo.X
★★★★★★★★★★★★★★★★★」Foo['X']
숫자에서 문자열로의 매핑으로 기능합니다.이 역매핑은 디버깅 또는 로깅 목적으로 유용합니다.대부분의 경우,0
★★★★★★★★★★★★★★★★★」1
대응하는 ."X"
★★★★★★★★★★★★★★★★★」"Y"
.
"displicate" 또는 "displicate"
TypeScript 에서는 컴파일러가 알아야 할 사항을 "선언"할 수 있지만 실제로 코드를 내보낼 수는 없습니다.와 같이 "jQuery" "JQuery")$
컴파일러에 의해 작성된 코드는 필요 없습니다. 사양서 및 는 '이 '주변' 컨텍스트에 해 주십시오.모든 선언이 다음 중 하나임을 주의해 주십시오..d.ts
에는 "filen" (인 "filen이 있습니다.declare
선언 유형에 따라 수식어를 포함하거나 암묵적으로 갖는 것).
"인라인"
성능 및 코드 크기를 위해 컴파일할 때 열거형 멤버에 대한 참조를 숫자형 멤버로 대체하는 것이 좋습니다.
enum Foo { X = 4 }
var y = Foo.X; // emits "var y = 4";
스펙에서는 이 대체를 인라인이라고 합니다.그게 더 쿨하게 들리니까 인라이닝이라고 하겠습니다.예를 들어 enum 값이 API의 향후 버전에서 변경될 수 있으므로 열거 멤버를 인라인으로 표시하지 않을 수 있습니다.
에넘스, 어떻게 작동하는데?
이것을 열거의 각 측면별로 분류해 봅시다.유감스럽게도 이 4개의 섹션은 각각 다른 모든 용어를 참조하기 때문에 이 모든 내용을 한 번 이상 읽어야 합니다.
계산과 비계산(표준)
Enum 멤버를 계산할 수도 있고 계산할 수도 없습니다.사양에서는 계산되지 않은 멤버를 계속 호출하지만 const와의 혼동을 피하기 위해 계산되지 않은 멤버를 계속 호출합니다.
계산된 열거형 멤버는 컴파일 시 값을 알 수 없는 멤버입니다.물론 계산된 멤버에 대한 참조는 인라인으로 표시할 수 없습니다.반대로 계산되지 않은 열거형 멤버는 컴파일 시 값이 알려진 적이 있습니다.계산되지 않은 멤버에 대한 참조는 항상 인라인으로 표시됩니다.
어떤 열거형 멤버가 계산되고 어떤 열거형 멤버가 계산되지 않습니까? 모든 , 멤버, 멤버, 멤버, 멤버.const
enum은 이름에서 알 수 있듯이 상수(즉, 비점수)입니다.정수 열거형이 아닌 경우 주변(선언) 열거형인지 비주변 열거형인지에 따라 달라집니다.
의 declare enum
(즉, 주변 열거형)은 이니셜라이저가 있는 경우에만 상수입니다.그렇지 않으면 계산됩니다.에 주의해 주세요.declare enum
숫자 이니셜라이저만 사용할 수 있습니다.§:
declare enum Foo {
X, // Computed
Y = 2, // Non-computed
Z, // Computed! Not 3! Careful!
Q = 1 + 1 // Error
}
마지막으로, 비선언 비상수 열거의 구성원은 항상 계산되는 것으로 간주됩니다.그러나 컴파일 시 계산 가능한 경우 초기화 식은 상수로 감소합니다.즉, 일정하지 않은 열거형 멤버는 인라인 처리되지 않습니다(이 동작은 TypeScript 1.5에서 변경되었습니다. 하단의 "TypeScript의 변경 사항" 참조).
const vs nonstant
컨스턴트
에는 '알다'를 할 수 .const
수식어열거가 다음과 같은 경우const
, 그 멤버에 대한 모든 레퍼런스가 인라인으로 표시됩니다.
const enum Foo { A = 4 }
var x = Foo.A; // emitted as "var x = 4;", always
compiled. enums에서 검색 . 때문에 ', '오류', '오류', '오류'를 할 수 .Foo
멤버 레퍼런스의 일부를 제외하고, 상기 코드에 기재되어 있습니다..Foo
오브젝트는 런타임에 존재합니다.
일정하지 않다
에 "Deagate"가 const
수식자. 해당 멤버에 대한 참조는 멤버가 비수식자일 경우에만 인라인으로 표시됩니다.일정하지 않거나 선언되지 않은 열거형은 조회 개체를 생성합니다.
선언(유언)과 비독점
은 '하다' 입니다.declare
TypeScript에는 매우 구체적인 의미가 있습니다.이 객체는 다른 곳에 존재합니다.기존의 사물을 묘사하기 위한 것입니다.사용.declare
실제로 존재하지 않는 오브젝트를 정의하는 것은 나쁜 결과를 초래할 수 있습니다.그 것에 대해서는 나중에 설명하겠습니다.
선언하다
A declare enum
는 조회 개체를 내보내지 않습니다.구성원을 계산하면 해당 구성원에 대한 참조는 인라인으로 표시됩니다(계산된 구성원과 계산되지 않은 구성원에 대한 위의 참조).
점은 가 된다는 것입니다.declare enum
허용됩니다. 예를 들어 이 코드는 컴파일 오류는 아니지만 실행 시 실패합니다.
// Note: Assume no other file has actually created a Foo var at runtime
declare enum Foo { Bar }
var s = 'Bar';
var b = Foo[s]; // Fails
이 에러는, 「컴파일러에 거짓말하지 말아 주세요」의 카테고리에 속합니다.「 」라고 하는 는, 「 」라고 하는 가 없는 경우.Foo
시 "Don't write" (쓰지 )declare enum Foo
!
A declare const enum
않다const enum
), --preserveConstEnums(아래 참조)의
비고정적인
non-declare enum은 합니다.const
인라이닝은 위에 설명되어 있습니다.
--preserve Const Enums 플래그
이 플래그는 딱 한 가지 효과가 있습니다.즉, 선언되지 않은 Const Enum은 조회 개체를 내보냅니다.인라인에는 영향이 없습니다.이것은 디버깅에 도움이 됩니다.
일반적인 오류
는 '이렇게'를 하는 것입니다.declare enum
의 「일부러」가 때enum
★★★★★★★★★★★★★★★★★」const enum
더 적절할 것 같습니다.일반적인 형식은 다음과 같습니다.
module MyModule {
// Claiming this enum exists with 'declare', but it doesn't...
export declare enum Lies {
Foo = 0,
Bar = 1
}
var x = Lies.Foo; // Depend on inlining
}
module SomeOtherCode {
// x ends up as 'undefined' at runtime
import x = MyModule.Lies;
// Try to use lookup object, which ought to exist
// runtime error, canot read property 0 of undefined
console.log(x[x.Foo]);
}
황금률을 기억하십시오.실제로 존재하지 않는 것은 절대 아니다.사용하다const enum
인라이닝이 또는 "인라이닝 "인라이닝"enum
★★★★★★★★★★★★★★★★★★★★★★★★★★★
TypeScript 변경 사항
TypeScript 1.4와 1.5 사이에 동작이 변경되었습니다(비정수 엔넘의 모든 멤버가 리터럴로 명시적으로 초기화된 경우에도 계산으로 처리하려면 https://github.com/Microsoft/TypeScript/issues/2183) 참조).이것은 말하자면, "아기를 분리"함으로써 인라인 동작을 보다 예측 가능하고 보다 깔끔하게 분리할 수 있게 한다.const enum
통상의 보 regular regular enum
이 변경 전에는 계산되지 않은 비상수 Enum 구성원은 보다 적극적으로 인라인 처리되었습니다.
여기서 몇 가지 일이 일어나고 있어요.케이스 바이 케이스로 갑시다.
열거하다
enum Cheese { Brie, Cheddar }
먼저, 평범하고 오래된 열거형입니다.JavaScript로 컴파일하면 룩업테이블이 생성됩니다.
룩업 테이블은 다음과 같습니다.
var Cheese;
(function (Cheese) {
Cheese[Cheese["Brie"] = 0] = "Brie";
Cheese[Cheese["Cheddar"] = 1] = "Cheddar";
})(Cheese || (Cheese = {}));
★★★★★★★★★★★★★★★★★★★★★★.Cheese.Brie
TypeScript, 서 in type type .Cheese.Brie
0.0으로 Cheese[0]
Cheese[0]
"Brie"
.
const enum
const enum Bread { Rye, Wheat }
이 경우 실제로 코드가 출력되지 않습니다.그 가치는 인라인을 그었다.다음은 JavaScript에서 값 0 자체를 내보냅니다.
Bread.Rye
Bread['Rye']
const enum
s'의 인라인화는 성능상의 이유로 유용할 수 있습니다.
ㅇㅇㅇㅇㅇㅇ는요?Bread[0]
실행 시 에러가 발생하여 컴파일러가 검출합니다.룩업 테이블이 없고 컴파일러가 여기에 인라인화되지 않습니다.
위의 경우 --preserveConstEnums 플래그를 사용하면 Bread가 조회 테이블을 내보냅니다.하지만 그것의 가치는 여전히 반영될 것이다.
열거를 선언하다
의 과 마찬가지로declare
,declare
는 코드를 방출하지 않으며 실제 코드를 다른 곳에서 정의했을 것으로 예상합니다.이것은 룩업 테이블을 내보내지 않습니다.
declare enum Wine { Red, Wine }
Wine.Red
Wine.Red
참조할 와인 룩업 테이블이 없기 때문에 다른 곳에서 정의하지 않으면 오류가 발생합니다.
const enum을 선언하다
이것은 룩업 테이블을 내보내지 않습니다.
declare const enum Fruit { Apple, Pear }
지만그!!!!!!!!!!!Fruit.Apple
00을 합니다. 다시 Fruit[0]
는 인라인 되어 있지 않고 룩업테이블이 없기 때문에 런타임에 에러가 발생합니다.
이 놀이터에 써놨어요.어떤 타입 스크립트가 어떤 JavaScript를 내보내는지 알기 위해 플레이하는 것을 추천합니다.
언급URL : https://stackoverflow.com/questions/28818849/how-do-the-different-enum-variants-work-in-typescript
'programing' 카테고리의 다른 글
src/main/resources 폴더에서 프리마커 템플릿 파일을 읽는 방법 (0) | 2023.04.04 |
---|---|
Wordpress admin menu messed (0) | 2023.04.04 |
JSON에 대한 JavaScript 관련 배열 (0) | 2023.04.04 |
오라올레디비로컬 시스템에 Oracle 제공자가 등록되어 있지 않습니다. (0) | 2023.04.04 |
Javascript 개체를 정렬하거나 배열로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.04 |