TypeScript是静态类型系统,在编译时作类型检查。通常而言,若是项目所用到的全部库、模块都是基于ts的,那么静态类型已经能够避免大部分编程层面的类型问题。不过,在一些场景下来,单纯静态类型是没法解决问题的,部分数据是动态传入到系统中的,主要包含场景以下:git
固然,还有其余可能,总之,单纯靠静态类型检查,没法解决运行时类型问题。所以,我写了tyshemo这个工具。它能够帮助咱们完成运行时的类型检查。它暴露了不少接口,其中的Ty接口,很适合在js中做为ts的补充被使用,咱们来看下。github
import { Ty } from 'tyshemo' @Ty.decorate.with([Number, Number]) class Some { constructor(a, b) { this.x = a + b } @Ty.decorate.with(String) name = 'calc' @Ty.decorate.with([Number], Number) plus(y) { return this.x + y } } const some = new Some(1, 3) // ok const some2 = new Some('1', '3') // throw error some.name = 'ooo' // ok some.name = 123 // throw error const z = some.plus(2) // ok const z1 = some.plus('3') // throw error
咱们能够经过 Ty.decorate.with()
做为装饰器来限定一个类上属性的值类型,方法的参数和返回值类型。编程
在正常的程序中,咱们有的时候也须要对值进行限定,可是因为js语言的特性,咱们没法对基础类型的值进行监听,不过咱们能够对object进行监听。咱们能够以下操做:工具
const o = process.env.NODE_ENV === 'production' ? {} : Ty.decorate({}).with({ name: String, age: Number, }) o.name = null // throw error o.name = 'aaa' // ok o.age = '12' // throw error o.age = 12 // ok
经过 process.env.NODE_ENV === 'production'
来控制当前环境,若是在正式环境,就不须要这个能力,毕竟咱们在测试环境已经作过充分验证了。post
要对来自API的数据进行检查,咱们能够这样操做。测试
function getData(url) { return fetch(url).then(res => res()).then((data) => { if (process.env.NODE_ENV !== 'production') { Ty.expect(data).to.be({ name: String, age: Number, }) } return data }) }
Ty
这个接口能够快速对数据进行结构化检查。tyshemo还有不少其余方面的能力,能够在它的文档中了解更多。fetch