개발자
TS에서 인터페이스에 대문자I 를 접두사로 붙이는 점에 대해 어떻게 생각하시는지 궁금합니다! 다들 이름 어떻게 지으시나요?
답변 4
인기 답변
저는 인터페이스 변수명을 지을 때 I prefix를 붙이지 않고 있습니다. 제가 처음 타입스크립트를 공부하기 시작했을 때부터 이미 그런 기조가 없어지고 있었던 것 같기도 합니다. 이유는 여러 가지가 있더라고요. 전체적인 맥락에서 네이밍 컨벤션을 해친다든지, 캡슐화 원칙에 위배가 된다든지요. 컨벤션을 결정하는 데에는 이유가 중요한 것 같습니다. 잘 상상은 가지 않지만 어떤 환경에서는 꼭 접두사가 있어야만 하는 이유가 있을 수도 있죠. 물론 현 상황에서는 대부분 그렇지는 않은 것 같아요. 애초에 거슬러 올라가 보면 접두사를 붙이게 된 이유가 네이밍을 통해 타입을 추론할 수 있도록 하는 것이라고 하는데, 요즘은 워낙 IDE나 에디터가 잘 되어 있어서 마우스만 올려도 쉽게 알 수 있으니까요. 결국 전체 네이밍 컨벤션을 유지하려고 한다는 전제 하에서 현재 내가 진행 중인 프로젝트에서 I prefix를 쓰고 있다면, 정말로 써야 하는지, 그것을 씀으로써 어떤 이득을 갖게 되는지 한 번쯤은 고민을 해 볼 필요가 있는 것 같습니다. 저라면 prefix를 붙이는 것에 대한 이점을 아직까지는 크게 느끼지는 못했기에 사용하지 않는 쪽을 선택할 것 같아요!
인기 답변
저희 팀은 타입에 헝가리안 표기법 사용하지 않기로 합의했습니다. 헝가리안 표기법을 사용하지 않기로 한 이유는 헝가리안 표기법이 더 이상 필요하지 않다고 판단했기 때문입니다. 헝가리안 표기법의 최대 장점은 prefix를 통해 타입을 쉽게 파악할 수 있다는 점입니다. 예전에는 IDE들이 마우스를 올린다고 해서 어떤 타입인지 알려줄만큼 똑똑하지 않았기 때문에, 변수에 prefix를 붙이는 컨벤션이 개발자들에게 큰 도움이 되곤 했습니다. 다만 이는 예전의 이야기이고, 현재는 타입이 궁금하면 마우스를 올리면 됩니다. 똑똑한 IDE들은 마우스를 올리면 어떤 타입인지 뿐만 아니라, 인터페이스 내부 속성들도 보여주기 때문에 오히려 더 많은 정보를 얻을 수 있다는 장점도 존재합니다. 추가적으로, 저희는 팀 ESLint 공유 컨피그에서 @typescript-eslint/naming-convention 규칙을 사용해 헝가리안 표기법 사용 시 경고를 표시하도록 설정해놓았습니다. 팀에서 합의한 내용들을 ESLint 규칙으로 지정해놓으면 일일이 문서를 참고할 필요 없이 합의된 컨벤션을 ESLint가 알려주기 때문에 편리합니다. (첨부 코드 참조)
1module.exports = {
2 rules: {
3 // 네이밍 컨벤션
4 // - 헝가리안 표기법 금지
5 // - 기본 변수는 camelCase, PascalCase, UPPER_CASE 허용
6 // 근거: IDE 기능이 발전하여 헝가리안 표기법을 이용한 타입 표기는 현재 시점에서 무의미함
7 '@typescript-eslint/naming-convention': [
8 'warn',
9 // camelCase 변수, PascalCase 변수, UPPER_CASE 변수 허용
10 {
11 selector: 'variable',
12 format: ['camelCase', 'PascalCase', 'UPPER_CASE'],
13 },
14 // camelCase 함수, PascalCase 함수 허용
15 {
16 selector: 'function',
17 format: ['camelCase', 'PascalCase'],
18 },
19 // PascalCase 클래스, interfaces, type aliases, enums 허용
20 {
21 selector: 'typeLike',
22 format: ['PascalCase'],
23 },
24 // interface 앞에 I 사용 불가
25 {
26 selector: 'interface',
27 format: ['PascalCase'],
28 custom: {
29 regex: '^I[A-Z]',
30 match: false,
31 },
32 },
33 // typeAlias 앞에 T 사용 불가
34 {
35 selector: 'typeAlias',
36 format: ['PascalCase'],
37 custom: {
38 regex: '^T[A-Z]',
39 match: false,
40 },
41 },
42 // typeParameter 앞에 T 사용 불가
43 {
44 selector: 'typeParameter',
45 format: ['PascalCase'],
46 custom: {
47 regex: '^T[A-Z]',
48 match: false,
49 },
50 },
51 ],
52 }
53}
여긴 제가 입사할때부터 쓰고 있어서 그대로 가고 있습니다 interface 뿐아니라 함수들도 형을 따로 선언하는경우 붙이고 있습니다. I를 없애면 그걸 대체할 다른 이름이나 Suffix를 붙여야해서 걍 쓰는 것 같아여 참고로 모두 index.ts types.ts 나눠서 구현하고 있습니다. 구현부의 선언은 최대한 깔끔하게 보이기 위해(?)
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!