Tengo un objeto de clase:
groupNameData: GroupNameData = new GroupNameData(); y tengo un objeto any
groupNameDatas: any; Acabo de asignar los valores de objeto de clase a any objeto, como
this.groupNameDatas = this.groupNameData; Significa que this.groupNameDatas (Any) puede aceptar cualquier tipo de datos, porque es any objeto.
Ahora he invertido la asignación, como
this.groupNameData = this.groupNameDatas;// any to class También funciona como mi primer ejemplo de asignación. ¿Por qué no arrojó un error como cannot convert implicitly "any" to "GroupNameData" ?
Este es el comportamiento esperado ( docs ). Esperemos que esta muestra lo aclare:
let someObj = new MyClass(); // someObj will be of the "MyClass" type. let anyObject : any; // since anyObject is typed as any, it can hold any type: anyObject = 1; anyObject = "foo"; // including your class: anyObject = someObj; // so, if it can hold anything, it's expected that we can assign our custom classes to it: someObj = anyObj;Pero, ¿cómo puede TypeScript aceptar asignar cualquier objeto a un objeto de clase?
Esa es la diversión con any tipo. Typescript no puede saber any su variable escrita contiene una instancia de su objeto o no. Es cualquier cosa, por lo que podría ser una instancia de su objeto.
Si observa la documentación oficial , dice claramente que con "cualquiera" se ignoran todas las comprobaciones de tiempo de compilación.
Fragmento relevante de los documentos:
Es posible que necesitemos describir el tipo de variables que no conocemos cuando estamos escribiendo una aplicación. Estos valores pueden provenir de contenido dinámico, por ejemplo, del usuario o de una biblioteca de terceros. En estos casos, queremos cancelar la verificación de tipos y dejar que los valores pasen por las verificaciones en tiempo de compilación. Para hacerlo, los etiquetamos con cualquier tipo:
let notSure: any = 4; notSure = "maybe a string instead"; notSure = false; // okay, definitely a booleanAny type es una forma poderosa de trabajar con JavaScript existente, lo que le permite habilitar y deshabilitar gradualmente la verificación de tipos durante la compilación. Es de esperar que Object desempeñe un papel similar, como lo hace en otros idiomas. Pero las variables de tipo Objeto solo le permiten asignarles cualquier valor; no puede llamar a métodos arbitrarios, incluso a los que realmente existen:
Si elige usar otro tipo, por ejemplo, un número o una cadena, los controles de tiempo de compilación se activan y sabe que no es correcto.
let notSure: any = 4; notSure.ifItExists(); // okay, ifItExists might exist at runtime notSure.toFixed(); // okay, toFixed exists (but the compiler doesn't check) let prettySure: Object = 4; prettySure.toFixed(); // Error: Property 'toFixed' doesn't exist on type 'Object'.Cualquier tipo también es útil si conoce una parte del tipo, pero tal vez no todo. Por ejemplo, puede tener una matriz pero la matriz tiene una combinación de diferentes tipos:
let list: any[] = [1, true, "free"]; list[1] = 100;
TypeScript necesita una forma de pensar diferente a la de un lenguaje tradicional de tipos estáticos. En lenguajes como C# o Java, el compilador da un error de tipo a menos que el programador haya proporcionado suficiente información para dejar claro al compilador que no debe dar un error de tipo. En Typescript, el compilador solo da un error de tipo si el programador ha proporcionado suficiente información para que el compilador sepa que los tipos no son válidos.
El uso de Any quita información al compilador.
Typescript se creó para permitir la adición incremental de información de tipo con tantos errores en el programa que se encuentran en la compilación como lo permita la información de tipo. Se puede considerar como una "superpelusa" que aprovecha cualquier tipo de información que se proporcione.
A lo largo de los años, Typescript se ha acercado a lo que esperan las personas (como yo) que están acostumbradas a los lenguajes de verificación de tipo de tiempo de compilación estrictos, pero lo mejor es que todavía "encaja" bien con Javascript.