How to get around property does not exist on 'Object'

If you use the any type instead of Object, you can access any property without compile errors.

However, I would advise to create an interface that marks the possible properties for that object:

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

Since all of the fields use ?:, it means that they might or might not be there. So this works:

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

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

If something comes from javascript, you can do something like this:

import isObject from 'lodash/isObject'

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

doStuff(myOptions) // this works now

Of course this solution only works as expected if you are only unsure about the presence of a property not of it's type.


If you don't want to change the type or create an interface, you can also use this syntax to access unknown properties:

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

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