运用duckie为JS做强范例搜检

JS是一门动态范例言语,在定义一个函数时,没法为其举行强范例指定,如:

function hello(name: string, content: string) {
   // 假如name或content不是string范例的话,就抛非常
}

假如没有范例指定的话:

  1. 开发者经常不知道一个函数须要什么数据范例。
  2. 涌现新鲜毛病时,给debug形成贫苦。

实在业界已有两种解决办法:

  1. 运用JSDoc对函数举行解释
  2. 运用强范例言语编程,末了编译成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,你须要:

  1. 困难的Google它新鲜的语法。
  2. 写出来还很丑。
  3. 末了别的开发者也看不懂。
  4. 参数传错也没有毛病提醒。(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能够像声明一个变量那样声明你的范例,且能够在运行时举行范例搜检。若有什么发起,迎接发起。

    原文作者:ssnau
    原文地址: https://segmentfault.com/a/1190000002596154
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞