TypeScript에서 "as const"는 무엇을 의미하며 그 사용 사례는 무엇입니까?
는 이 일이 헷갈린다.as const
몇 가지 자료와 동영상을 확인했지만 완전히 이해하지 못했습니다.
내 관심사는 그 사람들이as const
아래 코드의 의미와 그 사용의 이점은 무엇입니까?
const args = [8, 5] as const;
const angle = Math.atan2(...args);
console.log(angle);
이것은 어설션이라고 알려져 있다.aconst
assertion은 컴파일러에게 표현식에 대해 가능한 한 좁거나* 가장 구체적인 유형을 추론하도록 지시합니다.이 옵션을 끄면 컴파일러는 기본 유형 추론 동작을 사용합니다.이 동작으로 인해 더 넓어지거나 더 일반적인 유형이 될 수 있습니다.
이것은 "주장"이라고 불리고 "캐스트"라고 불리지 않습니다.TypeScript에서 것이 . "할 수 하지만, TypeScript의시스템은 과 "캐스트"를 합니다.const
assertions는 내보낸 JavaScript에서 완전히 지워집니다.따라서 실행 시 이 프로그램을 사용하는 프로그램 간에는 전혀 차이가 없습니다.as const
이치노
그러나 컴파일 시에는 현저한 차이가 있습니다. 여기서 ㅇㅇㅇㅇㅇㅇㅇ를 한번 as const
에서는 "예"를 참조해 주세요.
const args = [8, 5];
// const args: number[]
const angle = Math.atan2(...args); // error! Expected 2 arguments, but got 0 or more.
console.log(angle);
컴파일러는 다음과 같이 표시됩니다.const args = [8, 5];
의 유형을 유추합니다.number[]
사용한 number
컴파일러는 어떤 요소가 몇 개나 있는지 알 수 없습니다.이러한 추론은 일반적으로 타당합니다.대부분 배열 내용은 어떤 식으로든 수정되어야 합니다.쓰고 싶은 사람이 있으면args.push(17)
★★★★★★★★★★★★★★★★★」args[0]++
'행복하다'라는 말을 들으면 number[]
.
아쉽게도 다음 줄은Math.atan2(...args)
에러가 발생합니다.Math.atan2()
함수에는 정확히 두 개의 숫자 인수가 필요합니다. 에 대해 있습니다.args
요소가 때문에 컴파일러는 이 2가지 요소를 호출하고 불평합니다.따라서 컴파일러는 사용자가 호출하고 있다고 불평합니다.Math.atan2()
'0 이상'은 '0 이상'입니다.
을 「코드로」라고 하는 .as const
:
const args = [8, 5] as const;
// const args: readonly [8, 5]
const angle = Math.atan2(...args); // okay
console.log(angle);
는 그 사실을 해 냈습니다.args
은 「」입니다.readonly [8, 5]
...정확한 숫자의 태플.8
★★★★★★★★★★★★★★★★★」5
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.args.length
is 、 「 「 」라고 알려져 있습니다.2
이치노
그리고 이 정도면 다음 행에 충분합니다.Math.atan2()
는 컴파일러가 알고 있습니다.Math.atan2(...args)
is is is is is와 Math.atan2(8, 5)
이것은 유효한 콜입니다.
다시 말씀드리지만 런타임에는 전혀 차이가 없습니다. 모두 로그 " " " "1.0121970114513341
콘솔로 이동합니다. ★★★★★★★★★★★★★★★★★.const
다른 정적 유형 시스템과 마찬가지로 어설션은 런타임에 영향을 미치지 않습니다.대신, 컴파일러에게 코드의 의도를 더 많이 알려주고, 올바른 코드와 버그의 차이를 더 정확하게 구별할 수 있습니다.
및 타입의 되지 않습니다.a 레 、 레 、 어 、 ; 、 ;;;;;;; 。readonly
array 또는 tuple은 기술적으로 가변 버전보다 폭이 넓습니다.가변 어레이는 다음 유형의 서브타입으로 간주됩니다.readonly
것으로 알려져 . 예를 들어, 전자는 변이 방법을 가지고 있지 않습니다.push()
반면 후자는 그렇다.
즉, 완전한 읽기 전용 오브젝트(이것을 코드명)를 작성할 수 있습니다.as const
배열 위치 값은 다음과 같습니다.readonly
다음과
const args = [8, 5] as const;
args[0] = 3; // throws "Cannot assign to '0' because it is a read-only
args.push(3); // throws "Property 'push' does not exist on type 'readonly [8, 5]'"
에서, 「」라고 하는 것을 알수.args = [8, 5] as const
라고 args: readonly [8, 5]
첫 번째 선언은 읽기 전용 태플과 같기 때문입니다.
가 '완전 읽기 전용'인 경우 몇 가지 예외가 있습니다. 여기서 확인할 수 있습니다.단, 일반적인 이점은readonly
모든 오브젝트 속성에 추가된 동작.
const args = [8, 5];
// Without `as const` assert; `args` stills a constant, but you can modify its attributes
args[0] = 3; // -- WORKS
args.push(3); // -- WORKS
// You are only prevented from assigning values directly to your variable
args = 7; // -- THROWS ERROR
상세한 것에 대하여는, 다음의 관련 질문/답변 리스트를 참조해 주세요.
라고 쓰면const args = [8, 5]
때, 어떤 도 여러분이 을 쓰는 수 것입니다.args[0] = 23
★★★★★★★★★★★★★★★★★」args.push(30)
또는 그 어레이를 변경할 수 있습니다.J에 /J라는 .args
배열을 수 참조하는 배열을 변경할 수 ).args = "something else"
어레이를 변경할 수 있지만 변수가 가리키는 것은 변경할 수 없습니다.
「」, 「」를 합니다.as const
선언을 하는 것이 정말 한결같습니다.이 모든 것은 읽기 전용이므로 어레이를 전혀 수정할 수 없습니다.
코멘트에서 지적된 바와 같이 명확히 하기 위해:
"really make it constant"는 존재하지 않을 때 런타임 효과가 있음을 의미할 수 있습니다.실행 시 args.push(30)는 어레이를 계속 변경합니다.const가 하는 일은 TypeScript 컴파일러가 사용자가 보고 불만을 표시하도록 하는 것입니다.– jcalz
as const
는 컴파일러에만 영향을 주고 읽기 전용 효과에는 예외가 있습니다(댓글 참조).의 큰 입니다.const
★★★★★★★★★★★★★★★★★」as const
하나는 참조를 불변하게 하기 위해 사용되고 다른 하나는 참조되는 것을 불변하게 하기 위해 사용됩니다.
은 ★★★★★★★★★★★★입니다.const
주장.여기 도움이 되는 포스트가 있고, 여기 서류가 있습니다.
우리가 상수 어사션을 가진 새로운 리터럴 표현들을 구성할 때, 우리는 언어에 신호를 보낼 수 있습니다.
- 해당 식에서 리터럴 형식을 넓힐 수 없습니다(예: "hello"에서 문자열로 이동하지 않음).
- 객체 리터럴은 읽기 전용 속성을 가져옵니다.
- 어레이 리터럴이 읽기 전용 튜플이 되다
★★★★★★★★★★★★★★★★ const args = [8, 5] as const;
세 글머리 기호(bullet)가 적용되며, 과 같이됩니다.
// Type: readonly [8, 5]
const args = [8, 5] as const;
// Ok
args[0];
args[1];
// Error: Tuple type 'readonly [8, 5]' of length '2' has no element at index '2'.
args[2];
단언 없이:
// Type: number[]
const args = [8, 5];
// Ok
args[0];
args[1];
// Also Ok.
args[2];
as const
오브젝트나 어레이에 적용하면, 불변(즉, 읽기 전용)이 됩니다.다른 리터럴의 경우 유형 확장이 방지됩니다.
const args = [8, 5] as const;
args[0] = 10; ❌ Cannot assign to '0' because it is a read-only property.
기타 장점은 거의 없습니다.
- 다른 타입으로 캐스팅하지 않으면 프로그램을 실행하지 않고 컴파일 시 버그를 잡을 수 있습니다.
- 컴파일러에서는 중첩된 개체의 속성을 재할당할 수 없습니다.
언급URL : https://stackoverflow.com/questions/66993264/what-does-the-as-const-mean-in-typescript-and-what-is-its-use-case
'source' 카테고리의 다른 글
HTTP 'Get' 서비스 응답을 AngularJS로 캐시하시겠습니까? (0) | 2023.02.23 |
---|---|
WordPress의 하위 테마에서 위젯을 재정의하려면 어떻게 해야 합니까? (0) | 2023.02.23 |
URL로부터의 JSON 해석 (0) | 2023.02.23 |
ES7로 응답: Uncaughed TypeError: 정의되지 않은 속성 '상태'를 읽을 수 없습니다. (0) | 2023.02.18 |
[ts] 종료되지 않은 정규 표현 리터럴. (0) | 2023.02.14 |