source

TypeScript에서 "as const"는 무엇을 의미하며 그 사용 사례는 무엇입니까?

gigabyte 2023. 2. 23. 22:50
반응형

TypeScript에서 "as const"는 무엇을 의미하며 그 사용 사례는 무엇입니까?

는 이 일이 헷갈린다.as const몇 가지 자료와 동영상을 확인했지만 완전히 이해하지 못했습니다.

내 관심사는 그 사람들이as const아래 코드의 의미와 그 사용의 이점은 무엇입니까?

const args = [8, 5] as const;
const angle = Math.atan2(...args);
console.log(angle);

이것은 어설션이라고 알려져 있다.aconstassertion은 컴파일러에게 표현식에 대해 가능한 한 좁거나* 가장 구체적인 유형을 추론하도록 지시합니다.이 옵션을 끄면 컴파일러는 기본 유형 추론 동작을 사용합니다.이 동작으로 인해넓어지거나일반적인 유형이 될 수 있습니다.

이것은 "주장"이라고 불리고 "캐스트"라고 불리지 않습니다.TypeScript에서 것이 . "할 수 하지만, TypeScript의시스템은 과 "캐스트"를 합니다.constassertions는 내보낸 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 레 、 레 、 어 、 ; 、 ;;;;;;; 。readonlyarray 또는 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

상세한 것에 대하여는, 다음의 관련 질문/답변 리스트를 참조해 주세요.

  1. TypeScript에서 읽기 전용 어레이 태플을 선언하려면 어떻게 해야 합니까?
  2. 타입 어사션의 asTypeScript 연연 ? type?
  3. 타이프스크립트 읽기 전용 튜플

라고 쓰면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

반응형