Si quisiera asignar programáticamente una propiedad a un objeto en Javascript, lo haría así:
var obj = {};
obj.prop = "value";
Pero en TypeScript, esto genera un error:
La propiedad 'prop' no existe en el valor del tipo '{}'
¿Cómo se supone que debo asignar cualquier propiedad nueva a un objeto en TypeScript?
typescript
Peter Olson
fuente
fuente
Respuestas:
Es posible denotar
obj
comoany
, pero eso anula el propósito de usar el mecanografiado.obj = {}
implicaobj
es unObject
. Marcarlo comoany
no tiene sentido. Para lograr la consistencia deseada, se podría definir una interfaz de la siguiente manera.O para hacerlo compacto:
LooseObject
puede aceptar campos con cualquier cadena como clave yany
escribir como valor.La verdadera elegancia de esta solución es que puede incluir campos seguros en la interfaz.
fuente
LooseObject
lo tanto, puede tomar un error también.O todo de una vez:
fuente
any
poder usarlo? Simplemente se convierte en ruido extra en mi código ..: /any
. TypeScript se utiliza para detectar errores (potenciales) en tiempo de compilación. Si echas aany
silenciar errores, entonces pierdes el poder de escribir y también puedes volver a JS puro.any
idealmente debería usarse solo si está importando código para el que no puede escribir definiciones de TS o mientras migra su código de JS a TSTiendo a poner
any
del otro lado, es decir,var foo:IFoo = <any>{};
algo como esto sigue siendo seguro:Alternativamente, puede marcar estas propiedades como opcionales:
Pruébalo en línea
fuente
I still have <any>{
entonces no has compilado. TypeScript eliminaría eso en su emisiónvar foo: IFoo = {} as any
se prefiere. La antigua sintaxis para la conversión de tipos colisionaba con TSX (Typecript-ified JSX).Esta solución es útil cuando su objeto tiene Tipo específico. Como al obtener el objeto a otra fuente.
fuente
Aunque el compilador se queja, aún debería generarlo como lo requiera. Sin embargo, esto funcionará.
fuente
Una opción más para hacer eso es acceder a la propiedad como una colección:
fuente
Object.assign(obj, {prop: "value"})
de ES6 / ES2015 también funciona.Me sorprende que ninguna de las respuestas haga referencia a Object.assign, ya que esa es la técnica que uso cada vez que pienso en "composición" en JavaScript.
Y funciona como se esperaba en TypeScript:
Ventajas
any
tipo en absoluto&
cuando declara el tipo deobjectWithAllProps
), lo que comunica claramente que estamos componiendo un nuevo tipo sobre la marcha (es decir, dinámicamente)Cosas a tener en cuenta
existingObject
permanece intacto y, por lo tanto, no tiene unaemail
propiedad. Para la mayoría de los programadores de estilo funcional, eso es bueno ya que el resultado es El único cambio nuevo).fuente
Puede crear un nuevo objeto basado en el objeto antiguo utilizando el operador de propagación
TypeScript inferirá todos los campos del objeto original y VSCode realizará el autocompletado, etc.
fuente
Más simple será seguir
fuente
Es posible agregar un miembro a un objeto existente mediante
fuente
Como no puedes hacer esto:
Si su compilador TS y su linter no son estrictos, puede escribir esto:
Si su compilador o linter TS es estricto, otra respuesta sería escribir a máquina:
fuente
Almacene cualquier propiedad nueva en cualquier tipo de objeto mediante la conversión de tipo a 'any':
Más tarde, puede recuperarlo volviendo su objeto extendido a 'any':
fuente
Para garantizar que el tipo sea un
Object
(es decir , pares clave-valor ), use:fuente
Caso 1:
var car = {type: "BMW", model: "i8", color: "white"}; car['owner'] = "ibrahim"; // You can add a property:
Caso 2:
var car:any = {type: "BMW", model: "i8", color: "white"}; car.owner = "ibrahim"; // You can set a property: use any type
fuente
puedes usar esto:
fuente
Puede agregar esta declaración para silenciar las advertencias.
declare var obj: any;
fuente
La mejor práctica es usar la escritura segura, te recomiendo:
fuente
Para preservar su tipo anterior, transmita temporalmente su objeto a cualquier
La nueva propiedad dinámica solo estará disponible cuando use el elenco:
fuente
Aquí hay una versión especial de
Object.assign
, que ajusta automáticamente el tipo de variable con cada cambio de propiedad. No necesita variables adicionales, aserciones de tipo, tipos explícitos o copias de objetos:Nota: La muestra hace uso de las funciones de aserción TS 3.7 . El tipo de retorno de
assign
esvoid
, a diferencia deObject.assign
.fuente
Si está utilizando Typecript, presumiblemente desea utilizar el tipo de seguridad; en cuyo caso el Objeto desnudo y 'cualquiera' están contraindicados.
Es mejor no usar Object o {}, sino algún tipo con nombre; o puede estar utilizando una API con tipos específicos, que necesita ampliar con sus propios campos. He encontrado que esto funciona:
fuente
Asignar dinámicamente propiedades a un objeto en TypeScript.
para hacer eso solo necesita usar interfaces mecanografiadas de esta manera:
puedes usarlo así
fuente
attributes
campo dentroSomeClass
y eso debería solucionarlopublic attributes: IType = {};
pastebin.com/3xnu0TnNPrueba esto:
Entonces úsalo
fuente
La única solución que es totalmente segura para escribir es esta , pero es un poco prolija y te obliga a crear múltiples objetos.
Si primero debe crear un objeto vacío, luego elija una de estas dos soluciones. Tenga en cuenta que cada vez que usa
as
, está perdiendo seguridad.Solución más segura
El tipo de
object
es seguro en el interiorgetObject
, lo que significaobject.a
que será de tipostring | undefined
Solución corta
El tipo de no
object
es seguro en el interiorgetObject
, lo que significaobject.a
que será de tipostring
incluso antes de su asignación.fuente