Shane
Shane

Reputation: 5667

TypeScript property not found error:

I am getting the below error in my vscode:

[ts] Property 'getPatientAllAddress' does not exist on type 'Object'.

Why does it check for getPatientAllAddress() method which is getting added dynamically? This usually does not happen in Javascript.

get addresses() {
    if (this.data && this.data.hasOwnProperty("getPatientAllAddress")) {
        return this.data.getPatientAllAddress();
    }
}

How to supress/ignore this warning.

Upvotes: 3

Views: 2733

Answers (1)

Paarth
Paarth

Reputation: 10377

Up to this point this.data has had type Object. The error occurs because you're trying to access a .getPatientAllAddress() property on a variable of type Object. Even though you've confirmed logically that it should have that property, the compiler isn't yet smart enough to understand it should make that property available on that variable's interface.

Solution 1

If you don't have the noImplicitAny flag turned on you should be able to get away with changing the last line to

return data['getPatientAllAddress']();

Solution 2

Set the type of this.data to :{getPatientAllAddress?:Function} (or in a better world create the interface corresponding to this.data which includes that function).

using either Function or the appropriate more specific type.

Solution 3

Define an interface for the full data

interface Bleh {
    getPatientAllAddress : Function
}

and a type guard

function isBleh(x:any) : x is Bleh {
    return x && x.hasOwnProperty("getPatientAllAddress");
}

and use as

if (isBleh(this.data)) {
    this.data.getPatientAllAddress();
}

Solution 1 is the simplest, Solution 2 is the most correct (though you should really also define everything else in that interface too, not just this optional function), and Solution 3 is halfway me showing off language features and halfway talking about what you'll need to do in situations where 1 and 2 aren't viable.

Upvotes: 3

Related Questions