TypeScript 运行时类型检查补充工具

作者:纸飞机时间:2026-10-23 22:20:01浏览:603

TypeScript 提供编译时静态类型检查,但面对 API 响应、外部传参等动态数据时仍存在风险。本文介绍 tyshemo 工具,通过 Ty.decorate 装饰器限定类属性与方法类型,以及 Ty.expect 对 API 数据进行结构化校验,结合环境变量控制生产环境行为,有效补充运行时类型安全。

TypeScript 运行时类型检查的挑战

TypeScript 属于静态类型系统,在编译阶段执行类型检查。通常情况下,若项目中所有库和模块均基于 TypeScript 构建,静态类型足以规避大部分编程层面的类型错误。然而,在某些特定场景下,仅依靠静态类型无法完全解决问题,因为部分数据是动态传入系统的,主要涉及以下场景:

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

tyshemo 工具介绍

当然,还存在其他可能性。总之,单纯依赖静态类型检查无法解决运行时类型问题。为此,我开发了 tyshemo 工具,旨在协助完成运行时的类型检查。该工具暴露了多个接口,其中 Ty 接口非常适合在 JavaScript 中作为 TypeScript 的补充使用,接下来我们将进行具体查看。

使用装饰器限定类型


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() 作为装饰器,来限定类上属性的值类型,以及方法的参数和返回值类型。

在常规程序中,有时也需要对值进行限定。由于 JavaScript 语言的特性,我们无法直接监听基础类型的值,但可以对 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 的数据进行检查,可采取如下操作。

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 还具备其他多种能力,详细信息可查阅其官方文档。

至此,关于 TypeScript 运行时类型检查补充工具的介绍便告一段落。如需了解更多相关 TypeScript 运行时类型检查内容,请搜索本站以往文章或继续浏览后续相关文章,希望大家今后多多支持本站!

作者最新文章
相关文章
更多