类型检查 
type-check 是一个库,它允许你在运行时用类似Haskell的类型语法检查JavaScript值的类型。它非常适合检查外部输入、测试,甚至可以为内部代码添加一点安全性。它是…的主要组成部分 levn. 麻省理工学院的许可。0.4.0版本。请查看 演示。
有关 type-check, 在twitter上关注我。
npm install type-check
快速的例子
// Basic types:
var typeCheck = require('type-check').typeCheck;
typeCheck('Number', 1); // true
typeCheck('Number', 'str'); // false
typeCheck('Error', new Error); // true
typeCheck('Undefined', undefined); // true
// Comment
typeCheck('count::Number', 1); // true
// One type OR another type:
typeCheck('Number | String', 2); // true
typeCheck('Number | String', 'str'); // true
// Wildcard, matches all types:
typeCheck('*', 2) // true
// Array, all elements of a single type:
typeCheck('[Number]', [1, 2, 3]); // true
typeCheck('[Number]', [1, 'str', 3]); // false
// Tuples, or fixed length arrays with elements of different types:
typeCheck('(String, Number)', ['str', 2]); // true
typeCheck('(String, Number)', ['str']); // false
typeCheck('(String, Number)', ['str', 2, 5]); // false
// Object properties:
typeCheck('{x: Number, y: Boolean}', {x: 2, y: false}); // true
typeCheck('{x: Number, y: Boolean}', {x: 2}); // false
typeCheck('{x: Number, y: Maybe Boolean}', {x: 2}); // true
typeCheck('{x: Number, y: Boolean}', {x: 2, y: false, z: 3}); // false
typeCheck('{x: Number, y: Boolean, ...}', {x: 2, y: false, z: 3}); // true
// A particular type AND object properties:
typeCheck('RegExp{source: String, ...}', /re/i); // true
typeCheck('RegExp{source: String, ...}', {source: 're'}); // false
// Custom types:
var opt = {customTypes:
{Even: { typeOf: 'Number', validate: function(x) { return x % 2 === 0; }}}};
typeCheck('Even', 2, opt); // true
// Nested:
var type = '{a: (String, [Number], {y: Array, ...}), b: Error{message: String, ...}}'
typeCheck(type, {a: ['hi', [1, 2, 3], {y: [1, 'ms']}], b: new Error('oh no')}); // true
用法
require('type-check'); 返回一个公开四个属性的对象。 VERSION 以字符串形式表示库的当前版本。 typeCheck, parseType, parsedTypeCheck 是功能。
// typeCheck(type, input, options);
typeCheck('Number', 2); // true
// parseType(type);
var parsedType = parseType('Number'); // object
// parsedTypeCheck(parsedType, input, options);
parsedTypeCheck(parsedType, 2); // true
typeCheck(类型,输入,选项)
typeCheck 检查JavaScript值 input 反对 type 写在 类型格式 (并考虑到可选的 options)并返回 input 匹配 type。
参数
- 类型,
String-写在 类型格式 要对照哪一个 - 输入-
*-任何JavaScript值,将根据类型进行检查 - 选项-
Maybe Object-一个可选参数,指定附加选项,目前唯一可用的选项是指定 自定义类型
返回
Boolean -输入是否与类型匹配
例子
typeCheck('Number', 2); // true
parseType(类型)
parseType 解析字符串 type 写在 类型格式 转换为表示已解析类型的对象。
参数
- 类型,
String-写在 类型格式 要解析哪个
返回
Object -以解析类型格式表示解析类型的对象
例子
parseType('Number'); // [{type: 'Number'}]
parsedTypeCheck(parsedType, input, options)
parsedTypeCheck 检查JavaScript值 input 对解析 type 在已解析的类型格式中(并考虑可选的 options)并返回 input 匹配 type. 与…结合使用 parseType 如果要多次使用一个类型。
参数
- 类型,
Object-要检查的已解析类型格式中的类型 - 输入-
*-任何JavaScript值,将根据类型进行检查 - 选项-
Maybe Object-一个可选参数,指定附加选项,目前唯一可用的选项是指定 自定义类型
返回
Boolean -输入是否与类型匹配
例子
parsedTypeCheck([{type: 'Number'}], 2); // true
var parsedType = parseType('String');
parsedTypeCheck(parsedType, 'str'); // true
##类型格式
语法
空白被忽略。根节点是a 类型。
- 标识符 =
[\$\w]+-一组小写或大写字母、数字、下划线或美元符号。String - 类型 =一个
Identifier,一个Identifier后面是Structure,只是……Structure,或通配符*——如。String,Object{x: Number},{x: Number},Array{0: String, 1: Boolean, length: Number},* - 类型 =可选的注释(an)
Identifier后面是::),可选的标识符Maybe,一个或多个Type,由|——如。Number,String | Date,Maybe Number,Maybe Boolean | String - 结构 =
Fields,或者Tuple,或Array——如。{x: Number},(String, Number),[Date] - 字段 =一个
{,跟随一个或多个Field用逗号分隔,(落后于逗号,是允许的),可选的an...(前面总是加逗号,),后面跟着a}——如。{x: Number, y: String},{k: Function, ...} - 场 =一个
Identifier,后面跟着一个冒号:,其次是Types——如。x: Date | String,y: Boolean - 元组 =一个
(,后面跟着一个或多个Types用逗号分隔,(落后于逗号,是允许的),后面跟着)——如(Date),(Number, Date) - 数组 =一个
[后面紧跟着一个Types后面是]——如。[Boolean],[Boolean | Null]
指南
type-check 使用 Object.toString 找出一个值的基本类型。具体地说,
{}.toString.call(VALUE).slice(8, -1)
{}.toString.call(true).slice(8, -1) // 'Boolean'
基本类型,如: Number,使用这张支票。这比使用更通用 typeof -例如,with document, typeof 生产 'object' 我们的技术产生了什么 'HTMLDocument'。
您可以通过使用。分隔类型来检查多个类型 |. 检查器从左到右执行,如果值是以下类型中的任何一种,则传递。 String | Boolean 首先检查值是否为字符串,然后检查是否为布尔值。如果不符合上述条件,则返回false。
添加一个 Maybe 在多个类型的列表前检查也是一样的 Null 和 Undefined ——如。 Maybe String 等于 Undefined | Null | String。
您可以在标识符后面添加注释,以提醒您该类型是用于什么的 :: 在一个类型(或多个类型)之前。评论被直接扔了出去。
通配符 * 匹配所有类型。
有三种类型的结构用于检查值的内容:‘fields’, ‘tuple’和‘array’。
如果由自身使用,‘fields’结构将传递任何类型的对象,只要它是的实例 Object 属性传递——这允许鸭子输入——例如。 {x: Boolean}。
若要检查属性是否通过,且值是否为特定类型,可以指定类型-例如。 Error{message: String}。
如果您想使一个字段成为可选的,您可以简单地使用 Maybe ——如。 {x: Boolean, y: Maybe String} 还是会通过 y 未定义(或null)。
如果你不关心值是否有超出你指定的属性,你可以使用‘etc’操作符 ... ——如。 {x: Boolean, ...} 将对象与an匹配 x 属性,该属性为布尔值,并且具有零个或多个其他属性。
对于数组,必须指定一个或多个类型(用。分隔) |) -它将传递任何长度的东西,只要每个元素传递提供的类型-例如。 [Number], [Number | String]。
元组检查固定数量的元素,每个元素可能具有不同的类型。每个元素之间用逗号分隔。 (String, Number)。
数组和元组结构检查值是否为类型 Array 默认情况下,但如果指定了另一种类型,它们将检查该类型-例如。 Int32Array[Number]. 您可以使用通配符 * 搜索任何类型。
请查看 类型优先级 用于类型检查的库。
选项
Options是一个对象。的可选参数 typeCheck 和 parsedTypeCheck 功能。当前唯一的选择是 customTypes。
例子:
var options = {
customTypes: {
Even: {
typeOf: 'Number',
validate: function(x) {
return x % 2 === 0;
}
}
}
};
typeCheck('Even', 2, options); // true
typeCheck('Even', 3, options); // false
customTypes 允许您设置用于验证的自定义类型。this的值是一个对象。对象的键是要匹配的类型。对象的每个值都是一个具有 typeOf 属性-字符串,和 validate 属性-一个函数。
这个 typeOf 属性是值应该是的类型(可选-如果没有设置) validate 将被使用),和 validate 是一个函数,如果值为该类型,则该函数应返回true。 validate 接收一个参数,这是我们正在检查的值。
技术对
type-check 写在 LiveScript -一种编译成JavaScript的语言。它还使用 prelude.ls 图书馆。