Hogyan dinamikusan hozzárendelni tulajdonságokat egy objektum géppel?

szavazat
129

Ha akartam programozottan rendelni egy ingatlan egy tárgy Javascript, megtenném így:

var obj = {};
obj.prop = value;

De géppel, ez hibát generál:

A tulajdonság „prop” nem létezik a típusú érték „{}”

Hogyan kéne rendelni az új ingatlan egy tárgy géppel?

A kérdést 03/10/2012 15:42
a forrás felhasználó
Más nyelveken...                            


21 válasz

szavazat
111

Lehetőség van jelölésére obj, mint any, de legyőzi az egész célja a géppel. obj = {}magában foglalja objegy Object. Jelöli meg anynincs értelme. Ahhoz, hogy elérjük a kívánt konzisztenciát interfész lehetne a következőképpen definiáljuk.

interface LooseObject {
    [key: string]: any
}

var obj: LooseObject = {};

VAGY, hogy ez a kompakt:

var obj: {[k: string]: any} = {};

LooseObjecttudja fogadni mezők bármilyen string kulcsot és anyírja mint érték.

obj.prop = "value";
obj.prop2 = 88;

Az igazi elegancia ez a megoldás, hogy akkor is typesafe mezők a felületen.

interface MyType {
    typesafeProp1?: number,
    requiredProp1: string,
    [key: string]: any
}

var obj: MyType ;
obj = { requiredProp1: "foo"}; // valid
obj = {} // error. 'requiredProp1' is missing
obj.typesafeProp1 = "bar" // error. typesafeProp1 should be a number

obj.prop = "value";
obj.prop2 = 88;
Válaszolt 08/06/2017 16:32
a forrás felhasználó

szavazat
61

Vagy minden egy menetben:

  var obj:any = {}
  obj.prop = 5;
Válaszolt 03/10/2012 16:51
a forrás felhasználó

szavazat
45

Hajlok arra, hogy tegye anya másik oldalon, azaz var foo:IFoo = <any>{};Szóval valahogy így még typesafe:

interface IFoo{
    bar:string;
    baz:string;
    boo:string;     
}

// How I tend to intialize 
var foo:IFoo = <any>{};

foo.bar = "asdf";
foo.baz = "boo";
foo.boo = "boo";

// the following is an error, 
// so you haven't lost type safety
foo.bar = 123; 

Másik lehetőség, hogy jelölje meg ezeket a tulajdonságokat, mint választható:

interface IFoo{
    bar?:string;
    baz?:string;
    boo?:string;    
}

// Now your simple initialization works
var foo:IFoo = {};

Próbáld meg online

Válaszolt 26/08/2013 13:32
a forrás felhasználó

szavazat
24

Ez a megoldás akkor hasznos, ha a tárgy bizonyos típusú. Mint amikor megszerzése az objektum más forrásból.

let user: User = new User();
(user as any).otherProperty = 'hello';
//user did not lose its type here.
Válaszolt 25/08/2016 08:51
a forrás felhasználó

szavazat
21

Bár a fordító kifogásolja azt még kimenetet, amit igényelnek. Azonban ez működni fog.

var s = {};
s['prop'] = true;
Válaszolt 03/10/2012 15:57
a forrás felhasználó

szavazat
14

Egy újabb lehetőség tenni, hogy elérni az ingatlan, mint egy gyűjtemény:

var obj = {};
obj['prop'] = "value";

Válaszolt 22/03/2017 13:23
a forrás felhasználó

szavazat
4

Annak biztosítására, hogy a típus egy Object(azaz kulcsértékpárokat ) használja:

const obj: {[x: string]: any} = {}
obj.prop = 'cool beans'
Válaszolt 16/06/2017 14:15
a forrás felhasználó

szavazat
3

A legcélszerűbb használni biztonságos gépelés, azt javasoljuk, hogy:

interface customObject extends MyObject {
   newProp: string;
   newProp2: number;
}
Válaszolt 11/10/2016 23:32
a forrás felhasználó

szavazat
2
  • 1. eset:

    var car = {type: "BMW", model: "i8", color: "white"}; car['owner'] = "ibrahim"; // You can add a property:

  • 2. eset:

    var car:any = {type: "BMW", model: "i8", color: "white"}; car.owner = "ibrahim"; // You can set a property: use any type

Válaszolt 12/01/2019 15:45
a forrás felhasználó

szavazat
2

Megőrizni a korábbi típusú, ideiglenes öntött a tárgyat bármely

  var obj = {}
  (<any>obj).prop = 5;

Az új, dinamikus tulajdonság csak akkor áll rendelkezésre, ha a szereplők:

  var a = obj.prop; ==> Will generate a compiler error
  var b = (<any>obj).prop; ==> Will assign 5 to b with no error;
Válaszolt 09/12/2016 16:44
a forrás felhasználó

szavazat
2

Tárolja az új ingatlan bármilyen objektum typecasting hogy „bármilyen”:

var extend = <any>myObject;
extend.NewProperty = anotherObject;

Később megszerezheti azt öntéssel a kiterjedt tárgy vissza a „minden”:

var extendedObject = <any>myObject;
var anotherObject = <AnotherObjectType>extendedObject.NewProperty;
Válaszolt 25/11/2015 13:21
a forrás felhasználó

szavazat
2

Felveheti ezt a nyilatkozatot, hogy elhallgattassa a figyelmeztetéseket.

declare var obj: any;

Válaszolt 03/10/2012 16:02
a forrás felhasználó

szavazat
1

Meglep, hogy sem a válaszok referencia Object.assign hiszen ez a technika, amit használni, amikor arra gondolok, „kompozíció” a JavaScript.

És ez a várt módon működik géppel:

interface IExisting {
    userName: string
}

interface INewStuff {
    email: string
}

const existingObject: IExisting = {
    userName: "jsmith"
}

const objectWithAllProps: IExisting & INewStuff = Object.assign({}, existingObject, {
    email: "jsmith@someplace.com"
})

console.log(objectWithAllProps.email); // jsmith@someplace.com

Előnyök

  • írja biztonsági egész, mert nem kell használni a anytípus egyáltalán
  • használja géppel összesített típusát (ezt jelzi &, amikor kimondja a fajta objectWithAllProps), amely világosan kommunikálja, hogy mi alkotó új típusú on-the-fly (azaz dinamikusan)

A dolgok, hogy tisztában

  1. Object.assign megvan a saját egyedi szempontjait (amelyek jól ismertek a legtapasztaltabb JS devs), hogy figyelembe kell venni az írás géppel.
    • Ezt fel lehet használni a változékony módon, vagy megváltoztathatatlan módon (I bizonyítani a megváltoztathatatlan fenti módon, ami azt jelenti, hogy existingObjectmarad érintetlen, és ezért nem rendelkezik emailtulajdon. A legtöbb funkcionális stílusú programozók, hogy ez egy jó dolog, mivel az eredmény az egyetlen új változás).
    • Object.assign működik a legjobban, ha van laposabb tárgyakat. Ha kombináljuk a két beágyazott objektumokat tartalmazó nullképes tulajdonságait, akkor a végén felülírása truthy értékeket definiált. Ha vigyázz a sorrendben a Object.assign érvek, akkor legyen finom.
Válaszolt 30/01/2019 16:21
a forrás felhasználó

szavazat
1

Lehetőség van hozzá egy tagot egy meglévő objektum

  1. szélesedő típus (értsd: meghosszabbítása / specializálódtak a felület)
  2. öntött az eredeti objektumot a kiterjesztett típusú
  3. hozzá a tag az objektum
interface IEnhancedPromise<T> extends Promise<T> {
    sayHello(): void;
}

const p = Promise.resolve("Peter");

const enhancedPromise = p as IEnhancedPromise<string>;

enhancedPromise.sayHello = () => enhancedPromise.then(value => console.info("Hello " + value));

// eventually prints "Hello Peter"
enhancedPromise.sayHello();
Válaszolt 08/03/2018 11:20
a forrás felhasználó

szavazat
1

Ha ön használ géppel, feltehetően a használni kívánt típusú biztonság; Ebben az esetben meztelen Object és a „minden” van counterindicated.

Jobb, hogy nem használja Object vagy {}, de néhány megnevezett típusú; vagy lehet, hogy egy API használatával konkrét típusokat, amelyben meg kell terjeszteni a saját területeken. Azt találtuk, hogy ez a munka:

class Given { ... }  // API specified fields; or maybe it's just Object {}

interface PropAble extends Given {
    props?: string;  // you can cast any Given to this and set .props
    // '?' indicates that the field is optional
}
let g:Given = getTheGivenObject();
(g as PropAble).props = "value for my new field";

// to avoid constantly casting: 
let k:PropAble = getTheGivenObject();
k.props = "value for props";
Válaszolt 02/01/2018 03:07
a forrás felhasználó

szavazat
1

dinamikusan hozzárendelni tulajdonságokat egy objektum géppel.

Ehhez meg csak meg kell használni géppel interfészek így:

interface IValue {
    prop1: string;
    prop2: string;
}

interface IType {
    [code: string]: IValue;
}

akkor tudja használni, így

var obj: IType = {};
obj['code1'] = { 
                 prop1: 'prop 1 value', 
                 prop2: 'prop 2 value' 
               };
Válaszolt 30/03/2017 04:31
a forrás felhasználó

szavazat
0

akkor használja ezt:

this.model = Object.assign(this.model, { newProp: 0 });
Válaszolt 09/07/2019 23:53
a forrás felhasználó

szavazat
0

Hozhat létre új objektumot alapján a régi objektumot terjedésének operátor

interface MyObject {
    prop1: string;
}

const myObj: MyObject = {
    prop1: 'foo',
}

const newObj = {
    ...myObj,
    prop2: 'bar',
}

console.log(newObj.prop2); // 'bar'

Géppel fogja következtetni az összes mezőt az eredeti objektum és VSCode fog tenni az automatikus kiegészítés, stb

Válaszolt 10/06/2019 01:59
a forrás felhasználó

szavazat
0

Legegyszerűbb lesz a következő

const obj = <any>{};
obj.prop1 = "value";
obj.prop2 = "another value"
Válaszolt 02/05/2019 23:18
a forrás felhasználó

szavazat
0

Javascript:

myObj.myProperty = 1;

Gépelt:

myObj['myProperty'] = 1;
Válaszolt 09/02/2019 09:43
a forrás felhasználó

szavazat
-1

Ha tudja használni ES6 JavaScript funkciókat használhatja Computer tulajdonságnevei kezelni ezt nagyon egyszerűen:

var req = {id : 0123456};    
var response = {responses: {[req.id]: 'The 0123456 response message'}};

A [req.id] objektum kulcs tartalmaz egy dinamikus értéket

Válaszolt 16/01/2018 11:03
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more