이 글에서는 TypeScript의 Enum(열거) 구문을 소개하고, Enum의 기본 사용법과 기본 JavaScript를 사용하여 Enum을 구현하는 방법에 대해 설명합니다.
Enum은 enumeration이라고도 하는 TypeScript의 새로운 구문으로, 일반적으로 상태 판단에 사용되는 동일한 계열의 여러 상수(수정할 수 없는 변수)를 관리하는 데 사용됩니다.
웹에서 일반적인 상태 판단은 요청을 처리할 때 그에 따라 다양한 응답 상태 코드를 처리하는 것입니다.
const handleResponseStatus = (status: number): void => { switch (status) { case 200: // 请求成功时 // Do something... break; case 400: // 请求失败时 // Do something... break; default: throw (new Error('No have status code!')); } };
하지만 응답 상태 코드는 모두 미리 정의되어 있으므로 코드가 다음과 같이 작성되는 것이 정상입니다. 이렇게 볼 수 있지만, 서버에서 오류가 발생할 때 백엔드가 일부 코드를 사용자 정의하고 해당 코드가 나타내는 오류를 프런트엔드에 알려주면 위 함수는 다음과 같이 될 수 있습니다.
const handleWrongStatus = (status: string): void => { switch (status) { case 'A': // Do something... break; case 'B': // Do something... break; case 'C': // Do something... break; default: throw (new Error('No have wrong code!')); } };
이런 종류의 코드라면, 방금 물려받은 사람 혼자서는 2주 전에 썼다고 해도 문서를 보지 않고서는 그들이 무엇을 의미하는지 기억하지 못할 것입니다.
하지만 Enum을 잘 활용하면 위와 같은 상황을 피할 수 있습니다.
먼저 Enum을 정의하는 방법을 살펴보겠습니다. 이는 객체 사용법과 매우 유사합니다.
enum requestStatusCodes { error, success, }
내용과 이름 사이에 등호를 추가할 필요가 없습니다. 중괄호는 변수라기보다는 상수라고 부르는 것이 더 적절합니다. 왜냐하면 Enum의 값은 수정될 수 없기 때문입니다. 따라서 이렇게 정의된 규칙이 코드 실행 중에 변경될까 봐 걱정할 필요가 없습니다. , 실행 오류가 발생합니다.
그리고 Enum은 동일한 일련의 상수를 정의하는 데 사용되므로 이러한 상수는 특정 값을 유지할 수 있어야 합니다. 맞습니다. Enum의 모든 상수는 =
를 통해 특정 값을 지정할 수 있습니다. =
来指定具体的值 。
但如果是像前面的 requestStatusCodes
,没有为 error
或 success
指定具体的值也不会出错,因为 TypeScript 会从 0
开始自动递增定义值,所以签名的 requestStatusCodes
会和下面的结果相同:
enum requestStatusCodes { error = 0, success = 1, }console.log(requestStatusCodes.error) // 0 console.log(requestStatusCodes.success) // 1
除了数字外,也可以定义为字串:
enum requestWrongCodes { missingParameter = 'A', wrongParameter = 'B', invalidToken = 'C', }console.log(requestWrongCodes.wrongParameter) // 'B'
当然也可以在一个 enum 中设定不同的类型,但这样一点意义都没有:
enum requestStatusCodes { error = 0, success = 'OK', }
了解基本的 Enum 怎么定义后,接着就来改写前面代码中的 handleResponseStatus
和 handleWrongStatus
,让它们在语义上能够更明确。
首先用 Enum 定义两者的状态描述:
enum requestStatusCodes { error = 400, success = 200, } enum requestWrongCodes { missingParameter = 'A', wrongParameterType = 'B', invalidToken = 'C', }
然后修改 handleResponseStatus
和 handleWrongStatus
中的 Switch 判断:
const handleResponseStatus = (status: number): void => { switch (status) { case requestStatusCodes.success: // Do something... break; case requestStatusCodes.error: // Do something... break; default: throw (new Error('No have status code!')); } }; const handleWrongStatus = (status: string): void => { // 如果觉得 requestWrongCodes.missingParameter 太长了,也可以用以下方式: const { missingParameter, wrongParameterType, invalidToken, } = requestWrongCodes; switch (status) { case missingParameter: // Do something... break; case wrongParameterType: // Do something... break; case invalidToken: // Do something... break; default: throw (new Error('No have wrong code!')); } };
修改后的代码就变得直观多了,因为状态码都被放到了 Enum 中统一管理,所以就能用常量名来代表它们,之后不管过了多久,可以明确的知道这里再做什么,甚至连注解或文档都不用写了,因为代码就是最好的文档。
善用 Enum 能使代码绝对是不可或缺的,但就算没使用 TypeScript 也别灰心,因为 TypeScript 最终会被转换为 JavaScript ,那来看看如何直接用 JavaScript 实现 Enum 吧!
在前面说过 Enum 很像 Object ,如果研究一下 Enum 被编译成 javascript 之后的代码,就会发现还真的是 Object。
Enum 被编译后会变成 Key 和 Value 反向对应的对象,这样看起来非常简单,为了方便使用,下面把它的编译方式写成一个函数:
const newEnum = (descriptions) => { const result = {}; Object.keys(descriptions).forEach((description) => { result[result[description] = descriptions[description]] = description; }); return result; }; const responseStatus = newEnum({ error: 400, success: 200, }); // { '200': 'success', '400': 'error', error: 400, success: 200 } console.log(responseStatus);
虽然得到的结果相同,但是丧失了 Enum 中最可贵的常量特色,如果不能让它变成不可修改,那就有可能会在代码里不经意地改动它,导致执行结果可能出错,于是可以在最后利用 Object.freeze()
,让外部操作无法新增、删除或重新定义任何 Property :
const newEnum = (descriptions) => { const result = {}; Object.keys(descriptions).forEach((description) => { result[result[description] = descriptions[description]] = description; }); return Object.freeze(result); }; const responseStatus = newEnum({ error: 400, success: 200, }); // 即使不小心修改了 responseStatus['200'] = 'aaaaaaaa'; // 仍然是 { '200': 'success', '400': 'error', error: 400, success: 200 } console.log(responseStatus);
这样就能简单在 JavaScript 中实现 Enum 了。
从前面的 JavaScript 代码中可以看到 Enum 编译过后会变成 Key 和 Value 互相对应的 Object ,也就是说不管是用 Key 还是Value 都可以取出对应的值,
但是如果用 const
声明 Enum ,编译之后就不会产生 Object。
直接看例子,假设我把 responseState
用 const
重新生命,且也是以 handleResponseStatus
使用该 Enum 做判断:
enum responseStatus { error = 400, success = 200, } const handleResponseStatus = (status: number): void => { switch (status) { case responseStatus.success: console.log('请求成功!'); break; case responseStatus.error: console.log('请求失败!'); break; default: throw (new Error('No have status code!')); } };
看起来一切正常,不过在编译后的 JavaScript 中,会发现 Enum 并没有产生 Object ,而是直接用 const
声明在 Enum 中的值。
用 const
声明 Enum 有几个好处:
假设要用到的 Enum 非常多,那在执行时就会不停地使用 IIFE 产生 Object 将 Key 和 Value 绑定到 Object,会造成一些效率上的损失,也会增加内存,但是 const
requestStatusCodes
와 같으면 error
또는 success
에 특정 값을 지정하지 않으면 오류가 발생하지 않습니다. 0
부터 시작하여 정의된 값을 자동으로 증가시키기 시작하므로 서명된 requestStatusCodes
는 다음과 같은 결과를 갖게 됩니다. 🎜const enum responseStatus { error = 400, success = 200, }// 会出错,因为已经没有对象可供查找了 console.log(responseStatus[400])// 但这个不会有问题,因为编译的时候会直接填值 console.log(responseStatus.error)// 编译后: // console.log(400)
handleResponseStatus</code를 다시 작성하세요. > 및 <code>handleWrongStatus(이전 코드)
를 사용하여 의미론적으로 더 명시적으로 만듭니다. 🎜🎜먼저 Enum을 사용하여 두 가지의 상태 설명을 정의합니다. 🎜rrreee🎜그런 다음 handleResponseStatus
및 handleWrongStatus
에서 스위치 판단을 수정합니다. 🎜rrreee🎜수정된 코드가 직관적이 됩니다. , 통합 관리를 위해 상태 코드를 Enum에 넣어서 상수 이름으로 표현할 수 있기 때문에 시간이 아무리 오래 걸려도 여기서 무엇을 해야 할지 명확하게 알 수 있고, 댓글이나 문서를 작성할 필요도 없습니다. . 코드가 최고의 문서이기 때문입니다. 🎜🎜Enum을 잘 활용하여 코드를 꼭 필요하게 만드세요. 하지만 TypeScript를 사용하지 않더라도 낙담하지 마세요. TypeScript는 결국 JavaScript로 변환되므로 Enum을 직접 JavaScript로 구현하는 방법을 살펴보겠습니다. 자바스크립트! 🎜🎜네이티브 JavaScript를 사용하여 Enum 구현🎜🎜앞서 Enum이 Object와 매우 유사하다고 말씀드렸는데요. Enum이 Javascript로 컴파일된 후 코드를 연구해 보면 실제로는 Object라는 것을 알 수 있습니다. 🎜🎜Enum은 컴파일된 후 Key와 Value의 반대 객체가 됩니다. 사용의 편의를 위해 컴파일 방법을 함수로 작성해 보겠습니다. 🎜rrreee🎜결과는 동일하지만 손실됩니다. Enum의 가장 중요한 🎜constant🎜 기능은 수정 불가능하게 만들 수 없으면 코드에서 실수로 변경되어 실행 결과에 오류가 발생할 수 있으므로 Object.freeze(( )</ code>를 사용하여 외부 작업에서 속성을 추가, 삭제 또는 재정의할 수 없도록 합니다. 🎜rrreee🎜이렇게 하면 Enum을 JavaScript로 쉽게 구현할 수 있습니다. 🎜🎜Const Enum 사용🎜🎜 이전 JavaScript 코드에서 볼 수 있듯이 컴파일 후 Enum은 Key와 Value가 서로 일치하는 객체가 됩니다. 즉, Key를 사용하든 Value를 사용하든 관계없이 다음을 얻을 수 있습니다. 해당 값, 🎜🎜🎜 그런데 <code>const
로 Enum을 선언하면 컴파일 후에 Object가 생성되지 않습니다. 🎜🎜🎜예제를 직접 살펴보고 const
로 responseState
를 재생성하고 Enum을 사용하여 handleResponseStatus
로 판단한다고 가정해 보겠습니다. 🎜 모든 것이 정상인 것처럼 보이지만 컴파일된 JavaScript에서는 Enum이 Object를 생성하지 않고 const
를 직접 사용하여 Enum에서 값을 선언하는 것을 볼 수 있습니다. 🎜🎜const
를 사용하여 Enum을 선언하면 여러 가지 장점이 있습니다. 🎜const
는 객체를 생성하지 않으므로 객체가 생성되지 않습니다. 위의 문제. 🎜就算到的 Enum 不多,判断时也需要一直从 Object 中找出对应的值,而如果是用 const
声明 Enum ,在编译成 JS 时就将声明的值直接放入判断中。
不过这样也就没法从 Enum 中反向取值了,因为它并不会产生对象:
const enum responseStatus { error = 400, success = 200, }// 会出错,因为已经没有对象可供查找了 console.log(responseStatus[400])// 但这个不会有问题,因为编译的时候会直接填值 console.log(responseStatus.error)// 编译后: // console.log(400)
更多编程相关知识,请访问:编程入门!!
위 내용은 TypeScript에서 Enum(열거)의 사용법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!