TypeScript 运行时类型检查补充工具
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 运行时类型检查内容,请搜索本站以往文章或继续浏览后续相关文章,希望大家今后多多支持本站!
JS动态构建复杂嵌套JSON对象的方法
2026-11-05 15:41:52
JS负数取余为什么是负数?详解余数与模运算区别
2026-11-05 13:34:41
JS 解压出现乱码或报错怎么解决?
2026-11-05 12:32:38
JS 中 startsWith、indexOf 与正则判断字符串前缀的对比
2026-11-04 22:19:43
JS解析Excel后怎么将数据转换为JSON格式
2026-11-04 20:58:28








