자바스크립트 함수 타입 검사



자바스크립트는 언어 특성상 데이터 타입에 대해 까다롭지 않은 언어입니다.
 
죽, 타 언어와는 달리 함수에 전달되는 전달인자의 개수가 다르거나 전달인자의 타입이 다른 경우 해당하는 에러메시지
조차 없다는
말입니다.

함수에 전달되는 전달인자를 나타내는 객체인 arguments 객체를 이용하여 아래와 같이 해당 기능을 구현할 수 있습니다.


  1. function strict(types){
  2.    
  3.     var args = strict.caller.arguments;
  4.  
  5.     if (!types || types.constructor !== Array) return false;
  6.     if (typeof args !== 'object') return false;
  7.  
  8.     var tlen = types.length
  9.       , alen = args.length
  10.       , k = 1;
  11.      
  12.  
  13.     if (tlen !== alen){
  14.         throw new Error('전달인수 갯수가 일치하지 않습니다.');
  15.     }
  16.  
  17.     for (var i = 0; i < tlen; i++){
  18.        
  19.         if (!isDataType(types[i], args[i])){
  20.             throw new Error('호출 함수에 가장 일치하는 오버로드된 메서드의 ' + k + '(' + types[i] + ')' + ' 번째 인수에 잘못된 인수가 있습니다.');
  21.         }
  22.        
  23.         k++;
  24.     }
  25.  
  26.     return this;
  27. }
  28.  
  29. function isDataType(type, arg){
  30.  
  31.     type = type.toLowerCase();
  32.  
  33.     var types = {
  34.         'object': Object,
  35.         'array': Array,
  36.         'function': Function,
  37.         'string': String,
  38.         'number': Number,
  39.         'boolean': Boolean
  40.     };
  41.  
  42.     if (type !== 'newobject')
  43.     {
  44.    
  45.         if (types[type]){
  46.             if (arg.constructor === types[type]) return true;
  47.             else return false;
  48.         }
  49.     }
  50.     else
  51.     {
  52.         // typeof 연산자만 가지고는 new Function() 타입을 가려낼 수 없습니다.
  53.         if (arg.constructor !== Object && arg.constructor !== Array && typeof arg === 'object') return true;
  54.         else return false;
  55.     }
  56. };
  57.  
  58. function fn(obj, obj, arr, fn, str, num, bls){
  59.     strict(['object', 'newobject', 'array', 'function', 'string', 'number', 'boolean']);
  60. };
  61.  
  62.  
  63. // 아래는 각각 다른 타입의 전달인자를 넣어 호출 하는 예입니다.
  64.  
  65. var a = function() { ; };
  66. fn({}, new a(), [], function(){ ; }, 'str', 1, true);
  67. fn({}, {}, [], function(){ ; }, 'str', 1, true);
  68. fn({}, [], [], function(){ ; }, 'str', 1, true);


arguments 객체를 활용하여 위와 같은 구현은 가능하지만 모듈개발 시 잘 쓰이지 않는 것이 보통입니다.

하지만 알맞은 타입검사는 그만큼 해당 모듈의 에러를 줄여주는 역할을 합니다.