2016-04-13 22 views
17

üzerinde özellik hakkında bilgi almak için nasıl yapamazsınız Typescript konusunda yeni ve bu sorunun nasıl söyleneceğinden emin değilim.'Object'

Yapıcıda iletilen bir nesnede iki "olası" özelliğe erişmem gerekiyor. Tanımlanıp tanınmadığını görmek için bazı kontrolleri kaçırdığımı biliyorum, ancak Typescript bana "Nesne 'Object' (Nesne) 'üzerinde mesaj atmıyor. Mesaj, seçicisi ve şablon şablonunda görünür.

class View { 
    public options:Object = {}; 

    constructor(options:Object) { 
     this.options = options; 
    } 

    selector():string { 
     return this.options.selector; 
    } 

    template():string { 
     return this.options.template; 
    } 

    render():void { 

    } 
} 

Bunun oldukça basit olduğundan eminim, ancak Typescript benim için yeni.

cevap

22

Object yerine any türünü kullanırsanız, derleme hataları olmadan herhangi bir özelliğe erişebilirsiniz.

Ancak, bu nesne için olası özelliklerini işaretlendiği bir arayüz oluşturmak için tavsiye ediyorum: tüm alanları ?: kullandığından

interface Options { 
    selector?: string 
    template?: string 
} 

, bu onlar olabilir veya olmayabilir anlamına gelir. Yani bu çalışır:

function doStuff(o: Options) { 
    //... 
} 

doStuff({}) // empty object 
doStuff({ selector: "foo" }) // just one of the possible properties 
doStuff({ selector: "foo", template: "bar" }) // all props 

şey javascript geliyorsa, böyle bir şey yapabilirsiniz:

bu çözüm sadece bir özelliğin varlığı hakkında sadece emin değilseniz beklendiği gibi çalıştığını Tabii
import isObject from 'lodash/isObject' 

const myOptions: Options = isObject(somethingFromJS) // if an object 
    ? (<Options> somethingFromJS) // cast it 
    : {} // else create an empty object 

doStuff(myOptions) // this works now 

onun türü değil. Eğer türünü değiştirmek veya bir arayüz oluşturmak istemiyorsanız

+0

Hi, güzel bir cevap. Neden bir arayüz yerine bir sınıf kullanmadınız? –

10

, ayrıca bilinmeyen özelliklerine erişmek için şu sözdizimini kullanabilirsiniz:

selector():string { 
    return this.options["selector"]; 
} 

template():string { 
    return this.options["template"]; 
} 
İlgili konular