이번 포스팅에서는 JavaScript를 TypeScript와 같이 변수 타입에 대한 정의와 규칙을 보다 세밀하게 정의하고, VS Code에서의 툴팁 참조를 더 쉽게 할 수 있는 JSDoc 활용 및 사용법을 예제와 함께 다룹니다.
해당 포스팅에서는 VS Code와 오류를 시각적으로 코드에 보여주는 "Error Lens" Extension을 사용합니다.
1. TypeScript 오류 발생 시키기.
@ts-check를 Javascript 파일의 최 상단에 선언합니다.
Javascript를 module로 사용하는 경우나, 'use strick' 으로 사용하는 경우와 같이 IDE에서 TypeScript의 오류 구문을 보여주게 됩니다.
(단, 오류가 발생해도 브라우저 콘솔에 오류로 출력 되지는 않습니다.)
1) 오류 예시 : number 타입 변수에 boolean 값을 넣은 경우
2) 오류 건너뛰기
2. Enum
JSDoc의 @enum 키워드를 사용하여 enum형식을 정의합니다. 괄호({})에는 enum의 반환형을 기입합니다.
1) 정의
1 2 3 4 5 6 | /** @enum {string} */ const LOG_LEVEL = { DEBUG : "DEBUG", ERROR : "ERROR", WARNING : "WARNING" } |
2) 타입 정의
앞서 다룬 "@ts-check"를 적용할 경우 아래 사진과 같이 오류를 출력해 줍니다.
더불어, @type을 사용하면 정의한 'LOG_LEVEL' 외에도 number, string, boolean 등의 타입을 명시할 수 있습니다.
3. Function
Enum 파트에서 정의한 로그 레벨을 활용한 함수(function)에 대한 주석문서 예시입니다.
1) 인자, 반환값 명시
@params, @returns
2) 화살표 함수에서의 명시
@type을 사용하여 간단한 유틸성 함수의 경우에서 인자와 반환값을 명시합니다.
4. 자료형 정의
선언된 변수의 주석 외에도 TypeScript의 Interface와 같이 자료형에 대한 정의를 JSDoc을 통해 문서화 할 수 있습니다. 더불어, @ts-check를 통해 오류 예방과 생산성 향상을 기대해볼 수 있습니다.
1) 정의
@typedef 으로 명시할 자료형의 명칭을 작성합니다.
@properyt 의 괄호({})에 타입을 명시하고 자료형을 구성할 요소를 작성합니다.
2) 예제
sourceData를 정의하는 타입은 각각 18,19,20 라인이 모두 동일한 의미를 갖습니다.
- 4 : ISaveData - 배열 단위 자료형
- 9 : ISaveRowData - 행 단위 자료형
- 18 : 데이터 셋 단위로 명시
- 19 : 행 단위 데이터로 명시 (1)
- 20 : 행 단위 데이터로 명시 (2)
[전체 예제코드]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | // @ts-check (() => { /** @type {number} */ let number = 11; //@ts-expect-error number = ''; //@ts-ignore number = true; //#region :: Enum /** @enum {string} */ const LOG_LEVEL = { DEBUG : "DEBUG", ERROR : "ERROR", WARNING : "WARNING" } /** @type {LOG_LEVEL} */ const temp = LOG_LEVEL.DEBUG; /** * 이력 남기기. * * @param {LOG_LEVEL} logLevel 로그 수준 * @param {String} text 내용 * @returns {String} */ function History(logLevel, text) { const fullText = `[${logLevel}] ${text}`; console.log(fullText); return fullText; } /** @type {(logLevel:LOG_LEVEL, text:String) => String} */ const Arrow_History = (logLevel, text) => { const fullText = `[${logLevel}] ${text}`; console.log(fullText); return fullText; } //#endregion //#region :: Data Format /** * @typedef ISaveData * @type {ISaveRowData[]} */ /** * @typedef ISaveRowData * @property {String} seq * @property {String} product * @property {Number} price * @property {*} expireDt * @property {boolean} soldOut */ /** * 저장하는 함수 * * @param {ISaveData} inputData 저장하고자 하는 값 * @returns {boolean} */ function SaveData(inputData) { /** Save Logic */ return true; } /** @type {ISaveData} */ /** @type {ISaveRowData[]} */ /** @type {Array<ISaveRowData>} */ const sourceData = [ { seq: '001', product: 'apple' , price: 1000, expireDt: '2023-12-31', soldOut: false }, { seq: '002', product: 'banaa' , price: 2000, expireDt: '2024-01-00', soldOut: false }, { seq: '003', product: 'melon123', price: 4000, expireDt: '2033-10-01', soldOut: true }, { seq: '004', product: 'grape' , price: 1500, expireDt: '2023-11-15', soldOut: false }, { seq: '005', product: 'cherry' , price: 4400, expireDt: '2023-11-15', soldOut: true }, ]; SaveData(); //#endregion })() |
0 댓글