摘要:比如篇首这东西,使用声明声明一个类型跟声明一个对象般简单,完全没有学习成本。总结使用可以像声明一个变量那样声明你的类型,且可以在运行时进行类型检查。
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
摘要:在期间,华为正式发布云服务,聚焦物联网基础设施,构建产业生态黑土地,通过做大联接利用云服务和智能做强产业物联网,使能行业数字化。在HUAWEI CONNECT 2018期间,华为正式发布IoT云服务2.0,聚焦物联网基础设施,构建产业生态黑土地,通过做大联接、利用云服务和AI智能做强产业物联网,使能行业数字化。华为云核心网产品线总裁马海旭发布IoT云服务2.0根据华为GIV(全球产业愿景)报...
摘要:显然,相等判断是基于数字比较的,而条件判断是基于布尔值。严格相等严格相等的逻辑相对简单粗暴,如果类型不同,就不考虑隐式转换了,直接为假。 JavaScript 中大概有这几种 类型: undefined null string boolean number object function 之所以在 类型 上加了双引号,是因为严格来说,null 的类型是 object。但本文讨论的主...
亚马逊卖家专用vps有没有?亚马逊卖家最害怕的是什么,那就是被检测到使用同一个IP地址运营多个店铺,导致店铺被封禁的情况,而云服务器可以完美解决这种问题,至于原因为何,且听我满满道来!哪家亚马逊云主机好用呢?只要IP纯净,服务器稳定,用于亚马逊是很安全的,你可以百度搜索易探云,这家是专业的海外运营云服务器商家,同时推出美国电商云,保证IP纯净~搞亚马逊运营店铺,云服务器是绝佳选择,而易探云优惠力度...
摘要:为促进本市民营企业做强做优,实现创新发展,月日下午,上海市民营企业总部颁证仪式在市政府举行,优刻得作为上海市民营企业总部代表企业获颁牌匾,成为上海市民营经济发展的代表性企业之一。为促进本市民营企业做强做优,实现创新发展,4月15日下午,上海市民营企业总部颁证仪式在市政府举行,UCloud优刻得作为上海市民营企业总部代表企业获颁牌匾,成为上海市民营经济发展的代表性企业之一。根据上海市委、市政府...
摘要:亚马逊是什么意思亚马逊是什么意思亚马逊官方要求,一个人只能在亚马逊上申请注册一个商家帐户,不可以运营或维护多个商家帐户。亚马逊vps是什么意思?亚马逊官方要求,一个人只能在亚马逊上申请注册一个商家帐户,不可以运营或维护多个商家帐户。如果亚马逊的程序优化算法认为某几个帐户都是同一个人来操作,那么这几个账户就会被亚马逊评定为互相关联。因此,开亚马逊店铺,有一个好的VPS,开店就会顺畅许多。所以,...
阅读 1474·2021-11-25 09:43
阅读 4025·2021-11-15 11:37
阅读 3159·2021-08-17 10:13
阅读 3486·2019-08-30 14:16
阅读 3515·2019-08-26 18:37
阅读 2472·2019-08-26 11:56
阅读 1105·2019-08-26 10:42
阅读 590·2019-08-26 10:39