Hvordan tilordner jeg dynamisk egenskaper til et objekt i Loggfila?

stemmer
158

Hvis jeg ønsket å auto tildele en eiendom til et objekt i Javascript, ville jeg gjøre det slik:

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

Men i maskinskrevet manuskript, genererer dette en feil:

Egenskapen 'prop' finnes ikke på verdien av typen {} '

Hvordan skal jeg tildele noen nye eiendommen til et objekt i Loggfila?

Publisert på 03/10/2012 klokken 14:42
kilden bruker
På andre språk...                            


21 svar

stemmer
154

Det er mulig å betegne objsom any, men det Tap hele hensikten med å bruke Loggfila. obj = {}innebærer objer en Object. Merking det som anygir ingen mening. For å oppnå den ønskede konsistens et grensesnitt som kan defineres som følger.

interface LooseObject {
    [key: string]: any
}

var obj: LooseObject = {};

Eller å gjøre det kompakt:

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

LooseObjectkan akseptere felt med noen streng som nøkkel og anyskriver som verdi.

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

Den virkelige elegansen til denne løsningen er at du kan ta med typesafe felt i grensesnittet.

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;
Svarte 08/06/2017 kl. 16:32
kilden bruker

stemmer
68

Eller alt på en gang:

  var obj:any = {}
  obj.prop = 5;
Svarte 03/10/2012 kl. 15:51
kilden bruker

stemmer
45

Jeg pleier å sette anypå den andre siden vil si var foo:IFoo = <any>{};så noe sånt som dette er fortsatt 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; 

Alternativt kan du merke disse egenskapene som valgfritt:

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

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

Prøv det på nettet

Svarte 26/08/2013 kl. 12:32
kilden bruker

stemmer
29

Denne løsningen er nyttig når objektet har bestemt type. Som når skaffe objektet til annen kilde.

let user: User = new User();
(user as any).otherProperty = 'hello';
//user did not lose its type here.
Svarte 25/08/2016 kl. 08:51
kilden bruker

stemmer
24

Selv om kompilatoren klager det skal fortsatt sende den som du trenger. Men dette vil fungere.

var s = {};
s['prop'] = true;
Svarte 03/10/2012 kl. 14:57
kilden bruker

stemmer
18

En mer alternativ gjøre å det er å få tilgang til eiendommen som en samling:

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

Svarte 22/03/2017 kl. 13:23
kilden bruker

stemmer
4

For å garantere at den typen er en Object(dvs. nøkkelverdi-par ), bruk:

const obj: {[x: string]: any} = {}
obj.prop = 'cool beans'
Svarte 16/06/2017 kl. 14:15
kilden bruker

stemmer
3

Den beste praksis er å bruke trygt skrive, anbefaler jeg deg:

interface customObject extends MyObject {
   newProp: string;
   newProp2: number;
}
Svarte 11/10/2016 kl. 23:32
kilden bruker

stemmer
3

Du kan legge til denne erklæringen til taushet advarslene.

declare var obj: any;

Svarte 03/10/2012 kl. 15:02
kilden bruker

stemmer
2
  • Tilfelle 1:

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

  • Tilfelle 2:

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

Svarte 12/01/2019 kl. 15:45
kilden bruker

stemmer
2

For å bevare den forrige typen, midlertidig kastet objektet til noen

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

Den nye dynamiske egenskapen vil kun være tilgjengelig når du bruker cast:

  var a = obj.prop; ==> Will generate a compiler error
  var b = (<any>obj).prop; ==> Will assign 5 to b with no error;
Svarte 09/12/2016 kl. 16:44
kilden bruker

stemmer
2

Lagre noen ny eiendom på alle slags objekt ved typecasting den til 'noen':

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

Senere kan du hente det ved å kaste den utvidede objektet tilbake til 'noen':

var extendedObject = <any>myObject;
var anotherObject = <AnotherObjectType>extendedObject.NewProperty;
Svarte 25/11/2015 kl. 13:21
kilden bruker

stemmer
1

Jeg er overrasket over at ingen av svarene referere Object.assign siden det er teknikken jeg bruker når jeg tenker på "komposisjon" i Javascript.

Og det fungerer som forventet i Loggfila:

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

Fordeler

  • skriver sikkerhet gjennom fordi du ikke trenger å bruke den anytypen i det hele tatt
  • bruker Loggfila samlede type (som merket med &når erklære type objectWithAllProps), som tydelig kommuniserer at vi skriver en ny type on-the-fly (dvs. dynamisk)

Ting å være klar over

  1. Object.assign har sine egne unike aspekter (som er godt kjent for de fleste erfarne JS devs) som bør vurderes når du skriver Loggfila.
    • Den kan brukes i en foranderlig måte, eller en uforanderlig måte (jeg demonstrere uforanderlige måte over, noe som betyr at existingObjectforblir urørt og derfor ikke har en emaileiendom. For de fleste funksjonell stil programmerere, det er en god ting siden resultatet er den eneste nye endringen).
    • Object.assign fungerer best når du har flatere stedene. Hvis du kombinerer to nestede objekter som inneholder kan ha nullverdier egenskaper, kan du ende opp med å overskrive truthy verdier med udefinert. Hvis du se opp for rekkefølgen på Object.assign argumenter, bør du være i orden.
Svarte 30/01/2019 kl. 16:21
kilden bruker

stemmer
1

Det er mulig å legge til et medlem i en eksisterende objekt etter

  1. utvidelse av type (les: forlenge / spesialister grensesnittet)
  2. støpt det opprinnelige objektet til den utvidede typen
  3. legge til elementet til gjenstanden
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();
Svarte 08/03/2018 kl. 11:20
kilden bruker

stemmer
1

Hvis du bruker maskinskrevet manuskript, formodentlig du ønsker å bruke den type sikkerhet; i så fall naken Object og 'noen' er counterindicated.

Bedre å ikke bruke Object eller {}, men noen som heter type; eller du kan bruke en API med bestemte typer, som du må utvide med egne felt. Jeg har funnet at dette arbeidet:

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";
Svarte 02/01/2018 kl. 03:07
kilden bruker

stemmer
1

dynamisk tildele egenskaper til et objekt i script.

å gjøre det du trenger bare å bruke Loggfila grensesnitt som så:

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

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

du kan bruke det sånn

var obj: IType = {};
obj['code1'] = { 
    prop1: 'prop 1 value', 
    prop2: 'prop 2 value' 
};
Svarte 30/03/2017 kl. 04:31
kilden bruker

stemmer
0

du kan bruke denne:

this.model = Object.assign(this.model, { newProp: 0 });
Svarte 09/07/2019 kl. 23:53
kilden bruker

stemmer
0

Du kan lage nytt objekt basert på det gamle objektet med spredning operatør

interface MyObject {
    prop1: string;
}

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

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

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

Loggfila vil antyde alle feltene i den opprinnelige objektet og VSCode vil gjøre autofullføring, etc.

Svarte 10/06/2019 kl. 01:59
kilden bruker

stemmer
0

Enkleste vil følge

const obj = <any>{};
obj.prop1 = "value";
obj.prop2 = "another value"
Svarte 02/05/2019 kl. 23:18
kilden bruker

stemmer
0

javascript:

myObj.myProperty = 1;

Loggfila:

myObj['myProperty'] = 1;
Svarte 09/02/2019 kl. 09:43
kilden bruker

stemmer
-1

Hvis du klarer å bruke ES6 Javascript-funksjoner, kan du bruke beregnede navn Eiendoms å håndtere dette veldig enkelt:

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

Den [req.id] objekt nøkkelen har et dynamisk verdi

Svarte 16/01/2018 kl. 11:03
kilden bruker

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