Como parte de una revisión de código, un colega recomendó usar un tipo en lugar de una enumeración. Mientras hacíamos los cambios, encontramos un problema que ninguno de nosotros esperábamos.
Esperaríamos que el escenario uno y dos arrojaran errores de compilación y/o intellisense ya que uno de los valores no existe en el tipo. Sin embargo, después de la prueba, encontramos que solo el escenario uno genera errores, mientras que el escenario dos se resuelve sin problemas.
Es probable que se trate de un problema de comprensión, pero por todo lo que he leído (por ejemplo, tipos de literales de plantilla , deberíamos recibir errores cuando un valor proporcionado no existe).
Según lo anterior, ¿alguien puede explicar por qué solo vemos errores en el escenario uno pero no en el escenario dos?
Código de ejemplo
export type FileType = ".png" | ".tif" | ".tiff" | ".jpeg" | ".jpg"; const allowedFileTypes = [".exe"] as Array<FileType>; Expectativa: error del compilador porque .exe no existe
Resultado: error del compilador que indica que el valor no existe
Código de ejemplo
export type FileType = ".png" | ".tif" | ".tiff" | ".jpeg" | ".jpg"; const allowedFileTypes = [".exe", ".jpeg"] as Array<FileType>; Expectativa: error del compilador porque .exe no existe
Resultado: no hay errores del compilador
Código de ejemplo
export type FileType = ".png" | ".tif" | ".tiff" | ".jpeg" | ".jpg"; const allowedFileTypes = [".png", ".jpeg"] as Array<FileType>;Expectativa: No hay errores del compilador
Resultado: no hay errores del compilador
as Type es una forma de decir "Este valor es este tipo, incluso si no lo parece".
Está anulando la detección de tipo normal.
Es útil para cosas como:
const response = await fetch('/some/url'); const data = await response.json(); return data as Foo; donde sabe cuál es la forma de los datos que está recibiendo de la solicitud HTTP, pero el compilador no tiene forma de saberlo a menos que use as para decirlo explícitamente.
Es peligroso ya que puede especificar un tipo que no coincida con el valor que realmente tiene (como descubrió).
Tengo un proyecto en marcha en el que estoy usando superstruct para probar la forma de mis datos dentro de una función typeguard en lugar de confiar en as .
En su lugar, debe especificar qué se permite asignar a la variable:
const allowedFileTypes: Array<FileType> = [".exe", ".jpeg"];