Nasıl dinamik olarak daktilo Nesneye özellikler atarım?

oy
129

Programlama JavaScript bir nesneye özellik atamak isteseydim, bu gibi yapardı:

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

Ama daktilo, bu bir hata oluşturur:

Tesisin 'prop' Tür değerine yok '{}'

Nasıl daktilo bir nesneye herhangi bir yeni özellik atamak gerekiyor?

Oluştur 03/10/2012 saat 15:42
kaynak kullanıcı
Diğer dillerde...                            


21 cevaplar

oy
111

Belirtmek mümkündür objolarak any, ama bu typescript kullanarak bütün amacı yendi. obj = {}ima objbir bir Object. Olarak işaretleme anyhiçbir mantıklı. Aşağıdaki gibi bir arayüz tanımlanabilir arzu edilen bir kıvamı gerçekleştirmek için.

interface LooseObject {
    [key: string]: any
}

var obj: LooseObject = {};

YA da kompakt hale getirmek için:

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

LooseObjectanahtar olarak herhangi bir dize ile alanları kabul edebilir ve anydeğer olarak yazın.

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

Bu çözümün gerçek zerafet arayüzdeki türgüvenli alanları içerebilir olmasıdır.

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;
Cevap 08/06/2017 saat 16:32
kaynak kullanıcı

oy
61

Ya tek seferde hepsi:

  var obj:any = {}
  obj.prop = 5;
Cevap 03/10/2012 saat 16:51
kaynak kullanıcı

oy
45

Ben koymak eğilimindedir anyyani diğer tarafta var foo:IFoo = <any>{};Yani böyle bir şey hala türgüvenli geçerli:

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; 

Alternatif İsteğe bağlı olarak bu özellikleri işaretleyebilirsiniz:

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

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

Online Deneyin

Cevap 26/08/2013 saat 13:32
kaynak kullanıcı

oy
24

Nesneniz Özgül Tipi olduğunda bu çözüm yararlıdır. başka bir kaynaktan nesneyi alırken gibi.

let user: User = new User();
(user as any).otherProperty = 'hello';
//user did not lose its type here.
Cevap 25/08/2016 saat 08:51
kaynak kullanıcı

oy
21

derleyici şikayet rağmen bunu gerektirir olarak çıktı hala gerektiği. Ancak bu çalışacaktır.

var s = {};
s['prop'] = true;
Cevap 03/10/2012 saat 15:57
kaynak kullanıcı

oy
14

Buna yapmak bir seçenek daha bir koleksiyon olarak özelliğe erişmek için geçerli:

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

Cevap 22/03/2017 saat 13:23
kaynak kullanıcı

oy
4

Türü, bir olduğunu garanti etmek için Object(diğer bir deyişle temel değer çiftlerini ) kullanımı:

const obj: {[x: string]: any} = {}
obj.prop = 'cool beans'
Cevap 16/06/2017 saat 14:15
kaynak kullanıcı

oy
3

en iyi yöntem, sana tavsiye güvenli yazarak kullanmaktır:

interface customObject extends MyObject {
   newProp: string;
   newProp2: number;
}
Cevap 11/10/2016 saat 23:32
kaynak kullanıcı

oy
2
  • Dava 1:

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

  • Durum 2:

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

Cevap 12/01/2019 saat 15:45
kaynak kullanıcı

oy
2

herhangi geçici dökme senin nesneyi önceki türünü korumak için

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

Eğer döküm kullandığınızda yeni dinamik özellik yalnızca mevcut olacak:

  var a = obj.prop; ==> Will generate a compiler error
  var b = (<any>obj).prop; ==> Will assign 5 to b with no error;
Cevap 09/12/2016 saat 16:44
kaynak kullanıcı

oy
2

'Herhangi' onu typecasting tarafından nesnenin her türlü üzerinde herhangi bir yeni özellik Mağaza:

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

Daha sonra 'herhangi' geri genişletilmiş nesneyi döküm yoluyla alabilmesi tarih:

var extendedObject = <any>myObject;
var anotherObject = <AnotherObjectType>extendedObject.NewProperty;
Cevap 25/11/2015 saat 13:21
kaynak kullanıcı

oy
2

Sen uyarıları susturmak için bu bildiriyi ekleyebilir.

declare var obj: any;

Cevap 03/10/2012 saat 16:02
kaynak kullanıcı

oy
1

Ben cevapların hiçbiri JavaScript "kompozisyon" düşünmek zaman o kullandığım tekniktir beri Object.assign başvuru şaşırdım.

Typescript beklendiği gibi Ve çalışır:

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

Avantajları

  • Kullanmak gerekmez çünkü boyunca güvenliğini yazın anytürü hiç
  • (ile gösterilir olarak typescript en agrega türü kullanıyorsa &türünü bildirirken objectWithAllPropsaçıkça yeni bir tür oluştururken bu iletişim), (dinamik yani) on-the-fly

Yapılacaklar farkında olmak

  1. Object.assign o typescript yazarken düşünülmelidir kendine özgü yönleri (iyi en deneyimli JS devs yer aldığı bilinen) var sahiptir.
    • Bir değişken şekilde kullanılabilir veya bir değişmez bir şekilde (bunun anlamını yukarıdaki değişmez bir şekilde, ortaya existingObjectbir yok dolayısıyla bakir kalır ve emailözelliği. En işlevsel tarzı programcılar için bu iyi bir şey sonucudur beri yalnızca yeni değişim).
    • Eğer düz nesneleri varken Object.assign iyi çalışır. Eğer null özelliklerini içeren iki iç içe nesneleri birleştirerek iseniz, tanımsız ile truthy değerleri üzerine yazarak sona erebilir. Eğer Object.assign argümanlar sırasına dikkat ederse, ince olmalıdır.
Cevap 30/01/2019 saat 16:21
kaynak kullanıcı

oy
1

Varolan bir nesneye bir üye eklemek mümkündür

  1. türü genişleme (: / uzanan arayüzü uzmanlaşmış okuyun)
  2. Genişletilmiş tür orijinal nesneyi döküm
  3. nesneye üye eklemek
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();
Cevap 08/03/2018 saat 11:20
kaynak kullanıcı

oy
1

Eğer typescript kullanıyorsanız, muhtemelen tür güvenliği kullanmak istiyorum; bu durumda çıplak Nesne ve 'herhangi bir' kontrendike edilir.

Daha iyi Nesne veya {}, ancak bazı adlandırılmış türünü kullanmamayı; ya kendi alanları ile uzatmak gerek belirli türleri ile bir API kullanıyor olabilir. İşe bu tespit ettik:

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";
Cevap 02/01/2018 saat 03:07
kaynak kullanıcı

oy
1

Dinamik daktilo bir nesneye özellikler verilebilir.

Sadece şöyle typescript arayüzleri kullanmak gerekir bunu yapmak için:

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

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

Böyle kullanabilirsiniz

var obj: IType = {};
obj['code1'] = { 
                 prop1: 'prop 1 value', 
                 prop2: 'prop 2 value' 
               };
Cevap 30/03/2017 saat 04:31
kaynak kullanıcı

oy
0

Bunu kullanabilirsiniz:

this.model = Object.assign(this.model, { newProp: 0 });
Cevap 09/07/2019 saat 23:53
kaynak kullanıcı

oy
0

Sen yaymak operatörünü kullanarak eski nesneye dayalı yeni bir nesne oluşturabilir

interface MyObject {
    prop1: string;
}

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

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

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

Typescript orijinal nesnenin tüm alanları anlaması ve VSCode vb otomatik tamamlama yapacak

Cevap 10/06/2019 saat 01:59
kaynak kullanıcı

oy
0

En basit izlenecektir

const obj = <any>{};
obj.prop1 = "value";
obj.prop2 = "another value"
Cevap 02/05/2019 saat 23:18
kaynak kullanıcı

oy
0

JavaScript:

myObj.myProperty = 1;

typescript:

myObj['myProperty'] = 1;
Cevap 09/02/2019 saat 09:43
kaynak kullanıcı

oy
-1

Eğer ES6 JavaScript özelliklerini kullanabilmek için iseniz, kullanabilirsiniz Bilgisayarlı Mülkiyet Adları çok kolay bu işlemek için:

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

[Req.id] nesne anahtarının dinamik bir değere sahiptir

Cevap 16/01/2018 saat 11:03
kaynak kullanıcı

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