JS是一门动态范例言语,在定义一个函数时,没法为其举行强范例指定,如:
function hello(name: string, content: string) {
// 假如name或content不是string范例的话,就抛非常
}
假如没有范例指定的话:
- 开发者经常不知道一个函数须要什么数据范例。
- 涌现新鲜毛病时,给debug形成贫苦。
实在业界已有两种解决办法:
- 运用JSDoc对函数举行解释
- 运用强范例言语编程,末了编译成JS.
首先说第一种,JSDoc的语法划定规矩可谓贫苦,解释简朴范例时还轻微OK,如:
/**
* @param string name the name of the person
* @param string content the content to say
*/
function hello(name, content) { //... }
但假如我想对以下的数据构造做解释呢?
javascript
{ name: "jack", age: 18, address: { country: 'china', city: 'beijing' }, keywords: ['student', 'programmer', 'ios'] }
基础上没几个人能写的对JSDoc的解释,要对上述构造举行JSDoc,你须要:
- 困难的Google它新鲜的语法。
- 写出来还很丑。
- 末了别的开发者也看不懂。
- 参数传错也没有毛病提醒。(WebStorm肯定程度上能够举行范例推导)。
第二种,嗯,就不说了。
要想基础没有进修本钱的举行范例声明和搜检,下面进入正题,运用duckie.
装置
关于node/browserify/webpack的用户,直接:
npm install duckie
var t = require('duckie'); // go!
关于浏览器用户,能够直接运用https://github.com/ssnau/duckie/tree/master/build下已编译好的文件,也可用bower装置。末了能够运用window.duckie
。
入门
回到篇首,假如想完成function hello(name:string, content:string)
该怎样完成呢?
function hello(name, content) {
duckie.string.assert(name);
duckie.string.assert(content);
// 假如上面的断言不成立的话,将抛出非常
}
string
只是个示例,duckie统共支撑以下一些基础范例:
- boolean/bool
- number
- string
- undefined
- null
- array
- object
- anything, 示意恣意范例
即以下断言都为真:
duckie.boolean.assert(true);
duckie.number.assert(123);
duckie.string.assert('hello');
duckie.undefined.assert(undefined);
duckie.null.assert(null);
duckie.aray.assert([1,2,3]);
duckie.object.assert({name: 'jack'});
duckie.anything.assert('blabla');
假如只是断言简朴的范例,那大可不必用duckie,JSDoc就基础能完成这类功能,除了不会抛非常。
duckie真正有用的处所在于,定义庞杂的数据构造。
我们一个一个提及。
假如一个变量是罗列范例,怎样限制它的罗列值呢?
运用oneOf
.
// 只要值为male或female的变量,才经由过程认证
duckie.oneOf(['male', 'female']).assert('male') => true
duckie.oneOf(['male', 'female']).assert(1) => false
假如一个变量的范例,多是undefined,多是string,该怎样示意?
运用maybe
。
duckie.maybe(String).assert('hello') => true
duckie.maybe(String).assert(undefined) => true
duckie.maybe(String).assert(123) => false
/*注:String可替换为duckie.string或"string",意义都一样*/
假如一个变量的范例多是string,多是number呢?
运用oneOfType
。
duckie.oneOfType([String, Number]).assert(1) => true
duckie.oneOfType([String, Number]).assert("hello") => true
duckie.oneOfType([String, Number]).assert(true) => false
假如一个变量是一个由数字构成的数组,该怎样示意?
运用arrayOf(Number)
,或[Number]
.
// 运用arrayOf
duckie.arrayOf(Number).assert([1,2,3]) => true
// 直接运用[/*范例*/]
duckie([Number]).assert([1,2,3]) => true
duckie(['number']).assert(['hello', 'world']) => false
/* 注: 范例声明运用Number,duckie.number 和 'number' 结果是一样的。*/
假如一个变量是由一些key:value构成呢?
运用objectOf
,或[]
.
//比方定义一个Person数据构造,典范的变量以下:
var person = {
name: 'jack',
age: 18
};
duckie.objectOf({
name: String,
age: Number
}).assert(person) => true
duckie({
name: String,
age: Number
}).assert(person) => true
// 鸭子断言,即只请求被断言对象相符定义的
// 键值范例请求,而不请求准确婚配键数目
duckie({
name: String
}).assert(person) => true
duckie({
name: Number
}).assert(person) => false
假如一个变量是个object,内里有些值是数组呢?
以声明变量的体式格局用duckie声明你的范例。
// 比方篇首这东西
var person = {
name: "jack",
age: 18,
address: {
country: 'china',
city: 'beijing'
},
keywords: ['student', 'programmer', 'ios']
}
// 运用duckie声明
duckie({
name: String,
age: Number,
address: {
country: String,
city: String
},
keywords: [String]
}).assert(person) => true
声明一个范例跟声明一个对象般简朴,完整没有进修本钱。
总结
运用duckie能够像声明一个变量那样声明你的范例,且能够在运行时举行范例搜检。若有什么发起,迎接发起。