关于typescript:TypeScript-运行时类型检查补充工具

5次阅读

共计 1276 个字符,预计需要花费 4 分钟才能阅读完成。

TypeScript 是动态类型零碎,在编译时做类型查看。一般而言,如果我的项目所用到的所有库、模块都是基于 ts 的,那么动态类型曾经能够防止大部分编程层面的类型问题。不过,在一些场景下来,单纯动态类型是无奈解决问题的,局部数据是动静传入到零碎中的,次要蕴含场景如下:

  • 第三方数据源(接口 API、本地长久化存储、postMessage 等)
  • 第三方调用者传参
  • 全局状态变更

当然,还有其余可能,总之,单纯靠动态类型查看,无奈解决运行时类型问题。因而,我写了 tyshemo 这个工具。它能够帮忙咱们实现运行时的类型查看。它裸露了很多接口,其中的 Ty 接口,很适宜在 js 中作为 ts 的补充被应用,咱们来看下。

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' 来管制以后环境,如果在正式环境,就不须要这个能力,毕竟咱们在测试环境曾经做过充沛验证了。

要对来自 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 还有很多其余方面的能力,能够在它的文档中理解更多。

正文完
 0