From 70b08940be4ef426c1baa89302978b8b6ace160e Mon Sep 17 00:00:00 2001 From: Brandon Smith Date: Sat, 9 Dec 2017 11:55:08 -0500 Subject: [PATCH] Add `is.directInstanceOf()` (#38) --- readme.md | 14 ++++++++++++++ source/index.ts | 4 ++++ source/tests/test.ts | 11 +++++++++++ 3 files changed, 29 insertions(+) diff --git a/readme.md b/readme.md index a0d135d..67fad06 100644 --- a/readme.md +++ b/readme.md @@ -136,6 +136,20 @@ is.boundFunction(function () {}); #### Miscellaneous +##### .directInstanceOf(value, class) + +Returns `true` if `value` is a direct instance of `class`. + +```js +is.directInstanceOf(new Error(), Error); +//=> true + +class UnicornError extends Error {}; + +is.directInstanceOf(new UnicornError(), Error); +//=> false +``` + ##### .truthy(value) Returns `true` for all values that evaluate to true in a boolean context: diff --git a/source/index.ts b/source/index.ts index 196a49c..56d7ba2 100644 --- a/source/index.ts +++ b/source/index.ts @@ -162,6 +162,10 @@ namespace is { // tslint:disable-line:no-namespace export const arrayBuffer = isObjectOfType(TypeName.ArrayBuffer); export const sharedArrayBuffer = isObjectOfType(TypeName.SharedArrayBuffer); + // TODO: Remove `object` checks when targeting ES2015 or higher + // See `Notes`: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf + export const directInstanceOf = (instance: any, klass: any) => object(instance) && object(klass) && Object.getPrototypeOf(instance) === klass.prototype; + export const truthy = (value: any) => Boolean(value); export const falsy = (value: any) => !value; diff --git a/source/tests/test.ts b/source/tests/test.ts index 340defd..130594b 100644 --- a/source/tests/test.ts +++ b/source/tests/test.ts @@ -507,6 +507,17 @@ test('is.dataView', t => { testType(t, 'arrayBuffer'); }); +test('is.directInstanceOf', t => { + const error = new Error(); + const errorSubclass = new ErrorSubclassFixture(); + + t.true(m.directInstanceOf(error, Error)); + t.true(m.directInstanceOf(errorSubclass, ErrorSubclassFixture)); + + t.false(m.directInstanceOf(error, ErrorSubclassFixture)); + t.false(m.directInstanceOf(errorSubclass, Error)); +}); + test('is.truthy', t => { t.true(m.truthy('unicorn')); t.true(m.truthy('🦄'));