资讯专栏INFORMATION COLUMN

使用duckie为JS做强类型检查

tuomao / 1246人阅读

摘要:比如篇首这东西,使用声明声明一个类型跟声明一个对象般简单,完全没有学习成本。总结使用可以像声明一个变量那样声明你的类型,且可以在运行时进行类型检查。

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可以像声明一个变量那样声明你的类型,且可以在运行时进行类型检查。如有什么建议,欢迎提议。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85553.html

相关文章

  • 发布IoT云服务2.0,以“联接+云+智能”使能产业物联网

    摘要:在期间,华为正式发布云服务,聚焦物联网基础设施,构建产业生态黑土地,通过做大联接利用云服务和智能做强产业物联网,使能行业数字化。在HUAWEI CONNECT 2018期间,华为正式发布IoT云服务2.0,聚焦物联网基础设施,构建产业生态黑土地,通过做大联接、利用云服务和AI智能做强产业物联网,使能行业数字化。华为云核心网产品线总裁马海旭发布IoT云服务2.0根据华为GIV(全球产业愿景)报...

    coordinate35 评论0 收藏0
  • [JavaScript 随笔] 理解严格相等、非严格相等和隐式类型转换

    摘要:显然,相等判断是基于数字比较的,而条件判断是基于布尔值。严格相等严格相等的逻辑相对简单粗暴,如果类型不同,就不考虑隐式转换了,直接为假。 JavaScript 中大概有这几种 类型: undefined null string boolean number object function 之所以在 类型 上加了双引号,是因为严格来说,null 的类型是 object。但本文讨论的主...

    rickchen 评论0 收藏0
  • 亚马逊卖家专用vps有没有?哪家亚马逊云主机好用呢?

    亚马逊卖家专用vps有没有?亚马逊卖家最害怕的是什么,那就是被检测到使用同一个IP地址运营多个店铺,导致店铺被封禁的情况,而云服务器可以完美解决这种问题,至于原因为何,且听我满满道来!哪家亚马逊云主机好用呢?只要IP纯净,服务器稳定,用于亚马逊是很安全的,你可以百度搜索易探云,这家是专业的海外运营云服务器商家,同时推出美国电商云,保证IP纯净~搞亚马逊运营店铺,云服务器是绝佳选择,而易探云优惠力度...

    番茄西红柿 评论0 收藏2637
  • UCloud优刻得获颁上海市民营企业总部匾牌

    摘要:为促进本市民营企业做强做优,实现创新发展,月日下午,上海市民营企业总部颁证仪式在市政府举行,优刻得作为上海市民营企业总部代表企业获颁牌匾,成为上海市民营经济发展的代表性企业之一。为促进本市民营企业做强做优,实现创新发展,4月15日下午,上海市民营企业总部颁证仪式在市政府举行,UCloud优刻得作为上海市民营企业总部代表企业获颁牌匾,成为上海市民营经济发展的代表性企业之一。根据上海市委、市政府...

    Tecode 评论0 收藏0
  • 亚马逊vps是什么意思?亚马逊vps怎么用及价格多少钱?

    摘要:亚马逊是什么意思亚马逊是什么意思亚马逊官方要求,一个人只能在亚马逊上申请注册一个商家帐户,不可以运营或维护多个商家帐户。亚马逊vps是什么意思?亚马逊官方要求,一个人只能在亚马逊上申请注册一个商家帐户,不可以运营或维护多个商家帐户。如果亚马逊的程序优化算法认为某几个帐户都是同一个人来操作,那么这几个账户就会被亚马逊评定为互相关联。因此,开亚马逊店铺,有一个好的VPS,开店就会顺畅许多。所以,...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

最新活动
阅读需要支付1元查看
<