The default type for hasOwnProperty
is hasOwnProperty(v: PropertyKey): boolean;
. However, this prevents me from doing things like:
const obj = { a: 1 };
function foo(str: string) {
if (obj.hasOwnProperty(str)) {
console.log(obj[str]);
// Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ a: number; }'.
}
}
To override the type for obj.hasOwnProperty
, I added:
interface Object {
hasOwnProperty<T extends ObjectOf<any>>(this: T, key: any): key is keyof T;
}
This works for obj.hasOwnProperty(key)
, but not Object.prototype.hasOwnProperty.call(obj, key)
. How can I override hasOwnProperty
's type when I call it using the second method?
Edit: to clarify, even with the override, the following doesn't work:
const obj = { a: 1 };
function foo(str: string) {
if (Object.prototype.hasOwnProperty.call(obj, str)) {
console.log(obj[str]);
// Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ a: number; }'.
}
}