Skip to content

Commit

Permalink
perf: Reduce runtime prototype traversal for hasOwnProperty (enisdenj…
Browse files Browse the repository at this point in the history
  • Loading branch information
benjie committed Nov 4, 2020
1 parent 5cc9770 commit 1bb9218
Showing 1 changed file with 7 additions and 9 deletions.
16 changes: 7 additions & 9 deletions src/utils.ts
Expand Up @@ -5,6 +5,9 @@
*/
import { GraphQLError } from 'graphql';

// Extremely small optimisation, reduces runtime prototype traversal
const baseHasOwnProperty = Object.prototype.hasOwnProperty;

export function isObject(val: unknown): val is Record<PropertyKey, unknown> {
return typeof val === 'object' && val !== null;
}
Expand All @@ -29,31 +32,26 @@ export function hasOwnProperty<
O extends Record<PropertyKey, unknown>,
P extends PropertyKey
>(obj: O, prop: P): obj is O & Record<P, unknown> {
return Object.prototype.hasOwnProperty.call(obj, prop);
return baseHasOwnProperty.call(obj, prop);
}

export function hasOwnObjectProperty<
O extends Record<PropertyKey, unknown>,
P extends PropertyKey
>(obj: O, prop: P): obj is O & Record<P, Record<PropertyKey, unknown>> {
return Object.prototype.hasOwnProperty.call(obj, prop) && isObject(obj[prop]);
return baseHasOwnProperty.call(obj, prop) && isObject(obj[prop]);
}

export function hasOwnArrayProperty<
O extends Record<PropertyKey, unknown>,
P extends PropertyKey
>(obj: O, prop: P): obj is O & Record<P, unknown[]> {
return (
Object.prototype.hasOwnProperty.call(obj, prop) && Array.isArray(obj[prop])
);
return baseHasOwnProperty.call(obj, prop) && Array.isArray(obj[prop]);
}

export function hasOwnStringProperty<
O extends Record<PropertyKey, unknown>,
P extends PropertyKey
>(obj: O, prop: P): obj is O & Record<P, string> {
return (
Object.prototype.hasOwnProperty.call(obj, prop) &&
typeof obj[prop] === 'string'
);
return baseHasOwnProperty.call(obj, prop) && typeof obj[prop] === 'string';
}

0 comments on commit 1bb9218

Please sign in to comment.