O mienta, con una aserción de tipo, pero perderá la seguridad de tipo, ya que ahora quedará indefinido en lugares inesperados y posiblemente errores de tiempo de ejecución, al acceder, modal.contentetc. (propiedades que el contrato dice que estarán allí).
Puede pensar "oye, eso es realmente una duplicación de la interfaz", y está en lo correcto. Si la clase Modal es la única implementación de la interfaz IModal, es posible que desee eliminar la interfaz por completo y usar ...
Gracias. Tenía la esperanza de evitar tener que definir todos los contenidos modales inicialmente. ¿Sería más fácil si en lugar de una interfaz definiera Modal como una clase con propiedades y luego usara new y un constructor para configurar todos los valores iniciales?
1
Sí, podría definir una clase y luego solo tendría que crear nuevas instancias cuando las necesitara. ¿Necesitas un ejemplo?
Fenton
2
He agregado un ejemplo y una nota sobre la interfaz.
Fenton
21
var modal = <IModal>{};esto es lo que estaba buscando ;-) gracias!
Legends
55
Para su información, es mejor usar en {} as IModallugar de <IModal>{}. Elimina una ambigüedad en la gramática del lenguaje cuando se utilizan <foo>afirmaciones de estilo en JSX. Leer más . Y, por supuesto, usar leto en constlugar de var.
Alex Klaus
191
Si desea un objeto vacío de una interfaz, puede hacer simplemente:
var modal =<IModal>{};
La ventaja de usar interfaces en lugar de clases para estructurar datos es que si no tiene ningún método en la clase, se mostrará en JS compilado como un método vacío. Ejemplo:
que no tiene valor Las interfaces, por otro lado, no aparecen en JS mientras brindan los beneficios de la estructuración de datos y la verificación de tipos.
`Para agregar al comentario anterior. Para llamar a una función "updateModal (IModal modalInstance) {}", puede crear una instancia en línea de la interfaz 'IModal', como esta: // algún código aquí, donde la función updateModal y IModal son accesibles: updateModal (<IModal> {// esta línea crea un contenido de instancia: '', form: '', href: '', $ form: null, $ message: null, $ modal: null, $ submits: null}); // completa tu código '
Sunny
mediante el uso var modal= <abc>{}que acabamos de asignar modal de tipo abc de objeto vacío, pero ¿dónde hemos declarado el tipo de modal? Estoy usando typecript6.
Pardeep Jain
Esto no funcionó para mí, tuve que inicializar todo el objeto como se indica en la respuesta aceptada.
Rahul Sonwanshi
52
Si está utilizando React, el analizador se ahogará con la sintaxis de transmisión tradicional, por lo que se introdujo una alternativa para usar en archivos .tsx
Creo que tienes básicamente cinco opciones diferentes para hacerlo. Elegir entre ellos podría ser fácil dependiendo de la meta que le gustaría alcanzar.
La mejor manera en la mayoría de los casos es usar una clase e instanciarla , porque está usando TypeScript para aplicar la verificación de tipos.
Incluso si otros métodos ofrecen formas más fáciles de crear un objeto desde una interfaz, debería considerar dividir su interfaz , si está usando su objeto para diferentes asuntos, y no causa una segregación excesiva de la interfaz:
Por otro lado, por ejemplo, durante la prueba de la unidad de su código (si no aplica la separación de preocupaciones con frecuencia), puede aceptar los inconvenientes en aras de la productividad. Puede aplicar otros métodos para crear simulacros principalmente para grandes interfaces de terceros * .d.ts. Y podría ser una molestia implementar siempre objetos anónimos completos para cada interfaz enorme.
En esta ruta, su primera opción es crear un objeto vacío :
var modal =<IModal>{};
En segundo lugar, para realizar completamente la parte obligatoria de su interfaz . Puede ser útil si está llamando a bibliotecas JavaScript de terceros, pero creo que debería crear una clase, como antes:
var modal:IModal={
content:'',
form:'',//...
foo:(param: string):void=>{}};
En tercer lugar, puede crear solo una parte de su interfaz y crear un objeto anónimo , pero de esta manera usted es responsable de cumplir el contrato
var modal:IModal=<any>{
foo:(param: string):void=>{}};
Resumiendo mi respuesta, incluso si las interfaces son opcionales, ya que no están transpuestas en código JavaScript, TypeScript está allí para proporcionar un nuevo nivel de abstracción, si se usa de manera inteligente y coherente. Creo que, solo porque puedes descartarlos en la mayoría de los casos de tu propio código, no deberías.
classModal(){constructor(public iModal:IModal){//You now have access to all your interface variables using this.iModal object,//you don't need to define the properties at all, constructor does it for you.}}
Muchas de las soluciones hasta ahora publicadas utilizan aserciones de tipo y, por lo tanto , no arrojan errores de compilación si se omiten las propiedades de interfaz requeridas en la implementación.
Para aquellos interesados en otras soluciones robustas y compactas :
Opción 1: crear una instancia de una clase anónima que implemente la interfaz:
var modal = <IModal>{};
esto es lo que estaba buscando ;-) gracias!{} as IModal
lugar de<IModal>{}
. Elimina una ambigüedad en la gramática del lenguaje cuando se utilizan<foo>
afirmaciones de estilo en JSX. Leer más . Y, por supuesto, usarlet
o enconst
lugar devar
.Si desea un objeto vacío de una interfaz, puede hacer simplemente:
La ventaja de usar interfaces en lugar de clases para estructurar datos es que si no tiene ningún método en la clase, se mostrará en JS compilado como un método vacío. Ejemplo:
compila en
que no tiene valor Las interfaces, por otro lado, no aparecen en JS mientras brindan los beneficios de la estructuración de datos y la verificación de tipos.
fuente
var modal= <abc>{}
que acabamos de asignar modal de tipo abc de objeto vacío, pero ¿dónde hemos declarado el tipo de modal? Estoy usando typecript6.Si está utilizando React, el analizador se ahogará con la sintaxis de transmisión tradicional, por lo que se introdujo una alternativa para usar en archivos .tsx
https://www.typescriptlang.org/docs/handbook/jsx.html
fuente
Creo que tienes básicamente cinco opciones diferentes para hacerlo. Elegir entre ellos podría ser fácil dependiendo de la meta que le gustaría alcanzar.
La mejor manera en la mayoría de los casos es usar una clase e instanciarla , porque está usando TypeScript para aplicar la verificación de tipos.
Incluso si otros métodos ofrecen formas más fáciles de crear un objeto desde una interfaz, debería considerar dividir su interfaz , si está usando su objeto para diferentes asuntos, y no causa una segregación excesiva de la interfaz:
Por otro lado, por ejemplo, durante la prueba de la unidad de su código (si no aplica la separación de preocupaciones con frecuencia), puede aceptar los inconvenientes en aras de la productividad. Puede aplicar otros métodos para crear simulacros principalmente para grandes interfaces de terceros * .d.ts. Y podría ser una molestia implementar siempre objetos anónimos completos para cada interfaz enorme.
En esta ruta, su primera opción es crear un objeto vacío :
En segundo lugar, para realizar completamente la parte obligatoria de su interfaz . Puede ser útil si está llamando a bibliotecas JavaScript de terceros, pero creo que debería crear una clase, como antes:
En tercer lugar, puede crear solo una parte de su interfaz y crear un objeto anónimo , pero de esta manera usted es responsable de cumplir el contrato
Resumiendo mi respuesta, incluso si las interfaces son opcionales, ya que no están transpuestas en código JavaScript, TypeScript está allí para proporcionar un nuevo nivel de abstracción, si se usa de manera inteligente y coherente. Creo que, solo porque puedes descartarlos en la mayoría de los casos de tu propio código, no deberías.
fuente
Tu puedes hacer
fuente
Como no he encontrado una respuesta igual en la parte superior y mi respuesta es diferente. Hago:
fuente
Usando tu interfaz puedes hacer
fuente
Aquí hay otro enfoque:
Simplemente puede crear un objeto compatible con ESLint como este
O una instancia predeterminada basada en la interfaz y con valores predeterminados sensibles, si los hay
Luego, las variaciones de la instancia predeterminada simplemente anulando algunas propiedades
fuente
Muchas de las soluciones hasta ahora publicadas utilizan aserciones de tipo y, por lo tanto , no arrojan errores de compilación si se omiten las propiedades de interfaz requeridas en la implementación.
Para aquellos interesados en otras soluciones robustas y compactas :
Opción 1: crear una instancia de una clase anónima que implemente la interfaz:
Opción 2: crear una función de utilidad:
fuente
Puede establecer valores predeterminados usando
Class
.Sin constructor de clase:
Con constructor de clase
fuente