¿Cuál es la mejor manera de informar a los usuarios de las funciones de mi biblioteca que las variables pasadas no son del tipo correcto?

StackOverflow https://stackoverflow.com/questions/430937

  •  08-07-2019
  •  | 
  •  

Pregunta

Actualmente estoy en la creación de una biblioteca de funciones de JavaScript. Principalmente para mi propio uso, pero nunca puedes estar seguro si alguien más termina usándolo en sus proyectos, al menos lo estoy creando como si eso pudiera suceder.
La mayoría de los métodos solo funcionan si las variables que se pasan son del tipo de datos correcto. Ahora mi pregunta es: ¿Cuál es la mejor manera de alertar a los usuarios de que la variable no es del tipo correcto? ¿Se debería lanzar un error como este?

function foo(thisShouldBeAString){ //just pretend that this is a method and not a global function
 if(typeof(thisShouldBeAString) === 'string') {
  throw('foo(var), var should be of type string');
 }
 #yadayada
}

Sé que JavaScript realiza la conversión de tipo interna, pero esto puede crear resultados muy extraños (es decir, '234' + 5 = '2345' pero '234' * 1 = 234) y esto podría hacer que mis métodos hagan cosas muy extrañas.

EDITAR
Para aclarar las cosas: no deseo realizar la conversión de tipo, las variables pasadas deben ser del tipo correcto. ¿Cuál es la mejor manera de decirle al usuario de mi biblioteca que las variables pasadas no son del tipo correcto?

¿Fue útil?

Solución

Algunas pequeñas observaciones sobre la verificación de tipos: en realidad no es tan complicado:

Use typeof para verificar primitivas e instanceof para verificar tipos de objetos específicos.

Ejemplo: buscar cadenas con

typeof x === 'string'

o

typeof x === 'string' || x instanceof String

si desea incluir objetos de cadena.

Para verificar las matrices, simplemente use

x instanceof Array

Esto debería funcionar razonablemente bien (hay algunas excepciones conocidas, por ejemplo, Firefox 3.0.5 tiene un error donde window instanceof Object === false aunque window .__ proto__ instanceof Object == = verdadero ).

editar: Existen otros problemas con la detección de objetos de función:

En principio, ambos podrían usar typeof func === 'function' y func instanceof Function .

El problema es que en un navegador sin nombre de una gran empresa, estas comprobaciones devuelven los resultados incorrectos para algunas funciones predefinidas (su tipo se da como 'objeto' ). No conozco ninguna solución para esto: las comprobaciones solo funcionan de manera confiable para funciones definidas por el usuario ...

edit2: También hay problemas con los objetos pasados ??desde otras ventanas / marcos, ya que heredarán de diferentes objetos globales, es decir, instanceof fallará. Existen soluciones para los objetos incorporados: por ejemplo, puede verificar las matrices a través de Object.prototype.toString.call (x) === '[object Array]' .

Otros consejos

El problema con la verificación de tipo es que en realidad es bastante difícil de hacer. Por ejemplo: -

var s = new String("Hello World!");
alert(typeof s);

¿Qué se alerta? Respuesta: "objeto". Es cierto, es una forma tonta de inicializar una cadena, pero no obstante, a menudo la veo. Prefiero intentar conversiones cuando sea necesario o simplemente no hacer nada.

Dicho esto, en un entorno Javascript en el que tengo control total (que es not verdadero si simplemente está proporcionando una biblioteca), uso este conjunto de ajustes prototipo : -

String.prototype.isString = true;
Number.prototype.isNumber = true;
Boolean.prototype.isBoolean = true;
Date.prototype.isDate = true;
Array.prototype.isArray = true;

Por lo tanto, las pruebas para los tipos comunes pueden ser tan simples como: -

if (x.isString)

aunque aún debe tener cuidado con nulo / indefinido: -

if (x != null && x.isString)

Además de evitar el problema de new String (" thing ") , este enfoque es particularmente importante en fechas y matrices.

Las bibliotecas como jQuery no informan al usuario del error.

Si una función espera un número y un usuario pasa una cadena, la función simplemente regresa sin hacer nada.

De esa manera, evitará que aparezcan errores de JavaScript en un sitio web en vivo.

PS. Solo asegúrese de escribir siempre verifique sus parámetros ingresados, para evitar errores de JavaScript.

¿Qué tal throw : https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/ tirar

También el tipo de no distingue muy bien entre Array, Null, Object. Mire la función aquí: http://javascript.crockford.com/remedial.html , Además, hay algunas otras formas de hacerlo.

Personalmente, no haría la verificación de tipo, ya que es un paso que simplemente agregará más tiempo de procesamiento al código. Si le importa el rendimiento, desearía cortar tantos milisegundos de tiempo de procesamiento como sea posible. Una buena documentación curará la necesidad del cheque.

¿Qué pasa con la conversión silenciosa de cadenas a tipos de datos numéricos al iniciar la función?

Siempre puede determinar el tipo de datos de 'cadena'. No puedes

Puede verificar algún valor como " debug = 1 " conjunto. Si lo hay, podría generar errores como alertas. Entonces, en modo de desarrollo, el usuario los verá, pero en el sitio real lo apagará. El mismo navegador no le mostrará un mensaje de error: debe mirar la consola JS.

También hay FireBug. Puede detectar eso y poner mensajes de depuración de FB también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top