typ
Version:
Type predicates and assertions for Node
304 lines (193 loc) • 8.76 kB
Markdown
typ: Type predicates and assertions for Node
============================================
This Node module is meant to provide a unified place to ask and
assert about all the built-in JavaScript and core Node types.
"Typ" is German for "type". Also, as of this writing, both "type" and
"types" were taken in the npm module registry. The name was picked to
be both memorable and short, the latter in order to encourage it to be
used liberally.
Building and Installing
-----------------------
```shell
npm install typ
```
Or grab the source. As of this writing, this module has no
dependencies, so once you have the source, there's nothing more to do
to "build" it.
Testing
-------
```shell
npm test
```
Or
```shell
node ./test/test.js
```
API Details
-----------
Constants
---------
This module provides some convenient constants. With regards to the
string constants, the author finds it handy to use them instead of
quoted strings, since that makes typos cause more blatant errors.
### BOOLEAN
This is what's returned by `typeof` when given a boolean value.
### FUNCTION
This is what's returned by `typeof` when given a function value.
### NUMBER
This is what's returned by `typeof` when given a numeric value.
### OBJECT
This is what's returned by `typeof` when given an object value.
### STRING
This is what's returned by `typeof` when given a string value.
### UNDEFINED
This is what's returned by `typeof` when given `undefined`.
### ARRAY_PROTOTYPE
This is the object prototype of array instances.
### FUNCTION_PROTOTYPE
This is the object prototype of function instances.
### OBJECT_PROTOTYPE
This is the default object prototype.
Assertion Functions
-------------------
This module defines both predicates and assertions for a set of types
that covers the standard core JavaScript and Node types. For any given
type `name`, the predicate is called `isName()` and the assertion is
called `assertName()`. A predicate simply returns a boolean indicating
whether or not its value argument is of the appropriate type, and an
assertion does nothing other than throw a descriptive message if its
value argument is not of the expected type.
Predicates all take a single argument, `value`, the value to test.
Assertions all take two arguments, `value` as with the predicate, and
an optional `message` to replace the default message to report in an
error in the case of failure. The `message` if specified may contain
any number of instances of `%s`, which will be substituted with the
default message. `%%` is substituted with a single `%`. No other `%`
substitution is done.
The following run-down indicates the meaning of the various types, as
far as this module is concerned. If being a particular type implies
also being some other type(s), then that fact is indicated by an
"implies" line. (Note: Since all values but `undefined` are considered
`defined`, that fact isn't listed.)
### array: isArray(value), assertArray(value, message)
Implies: object
Arrays are what you get when you use the `[...]` array literal syntax
or the `new Array(...)` constructor.
### boolean: isBoolean(value), assertBoolean(value, message)
The only two booleans are `true` and `false`. Notably, `Boolean` objects
are not considered to be booleans here.
### buffer: isBuffer(value), assertBuffer(value, message)
Implies: object
Buffers are Node's standard ordered-list-of-bytes type, created
with the `new Buffer(...)` constructor and used all over the place
in Node.
### date: isDate(value), assertDate(value, message)
Implies: object
Dates represent moments in time. They can be created with the
`new Date(...)` constructor.
### defined: isDefined(value), assertDefined(value, message)
All values other than `undefined` are `defined`.
### error: isError(value), assertError(value, message)
Implies: object
Errors are the standard exception values in JavaScript. They can
be created by using the `new Error(...)` constructor as well
as sub-class constructors.
### function: isFunction(value), assertFunction(value, message)
Implies: object
Functions are the things in JavaScript that do work. They can
be created by using the `function...` definition and literal
syntax, as well as with the `new Function(...)` constructor.
### int: isInt(value), assertInt(value, message)
Implies: number
An int is an integer value, which is to say a number with no
fractional part. As far as this module is concerned, there is no
range limit on the ints (that is, an int doesn't have to fit in
32 bits, for example).
Notably, neither positive nor negative `Infinity` qualifies as an int.
In addition, as a strange edge case, "negative zero" is also *not*
considered to be an int. (You can produce a "negative zero" value
in JavaScript with the expression `-1e-1000`. You can differentiate
it from plain old regular zero by dividing `1` by it and observing
that the result is `-Infinity`.)
### map: isMap(value), assertMap(value, message)
Implies: object
A map is any object that behaves like a simple map-type collection.
In particular, a map's prototype must be the default object prototype,
and none of a map's bindings may be dynamic properties. That is,
getter and setter functions disqualify an object from being considered
a map.
### null: isNull(value), assertNull(value, message)
The only value that is null is `null` per se.
### nullish: isNullish(value), assertNullish(value, message)
The only two values that are considered to be "nullish" are `null`
and `undefined`.
### number: isNumber(value), assertNumber(value, message)
A number is, well, a numeric value. Numbers are what result from
using number literals (like `123`) and are returned, for example,
from the methods on the built-in `Math` object.
The values `Infinity` and `-Infinity` are considered to be numbers.
The special value `NaN` is alson considered to be a number, despite
the direct expansion of its name to "Not a Number".
Notably, `Number` objects are not considered numbers here.
### object: isObject(value), assertObject(value, message)
An object is an arbitrary mapping of string keys to values. They
can be created in any number of ways (and if you need more description
than that, you should find a good intro book on JavaScript).
Notably, `null` is *not* considered to be an object (even though
`typeof null == "object"`).
### regexp: isRegExp(value), assertRegExp(value, message)
Implies: object
A regexp is an object that represents a "regular expression". They
can be created by using the `/.../` literal syntax or the `new RegExp(...)`
constructor.
### string: isString(value), assertString(value, message)
A string is an ordered sequence of characters. They can be created
by using the `'...'` literal syntax and are produced by many standard
JavaScript functions.
Notably, `String` objects are not considered strings here.
### uint: isUInt(value), assertUInt(value, message)
Implies: int, number
A uint is an unsigned integer, also known as a whole number. That is,
it's anything that's an int which is also non-negative. `0` is notably
a uint.
### undefined: isUndefined(value), assertUndefined(value, message)
The only value that is undefined is `undefined`.
Notably, `null` is defined, *not* undefined.
Miscellaneous Functions
-----------------------
### hasDefaultPrototype(obj) -> boolean
Returns `true` if and only if the given object's prototype is the
default one. That is, this is just a convenient way to say:
```
Object.getPrototypeOf(obj) === OBJECT_PROTOTYPE
```
### hasOwnProperty(obj, name) -> boolean
This is a safe version of the per-object `hasOwnProperty()` method.
You should use this any time you can't be 100% sure that the object
you're checking won't possibly have a binding for `"hasOwnProperty"`.
To Do
-----
* Figure out something to do.
Contributing
------------
Questions, comments, bug reports, and pull requests are all welcome.
Submit them at [the project on GitHub](https://github.com/Obvious/typ/).
Bug reports that include steps-to-reproduce (including code) are the
best. Even better, make them in the form of pull requests that update
the test suite. Thanks!
Author
------
[Dan Bornstein](https://github.com/danfuzz)
([personal website](http://www.milk.com/)), supported by
[The Obvious Corporation](http://obvious.com/).
Thanks to [Jeremy Stanley](https://github.com/azulus),
[Dan Pupius](https://github.com/dpup),
[Mike Fleming](https://github.com/mikefleming),
and [Sho Kuwamoto](https://github.com/skuwamoto)
for suggestions.
License
-------
Copyright 2012 [The Obvious Corporation](http://obvious.com/).
Licensed under the Apache License, Version 2.0.
See the top-level file `LICENSE.txt` and
(http://www.apache.org/licenses/LICENSE-2.0).