在TypeScript和JavaScript如何使用MetaMessage?

简介: MetaMessage 是一种跨语言数据交换协议,支持 TypeScript/JavaScript(通过装饰器自动类型转换)、JSONC 文本与紧凑二进制 wire 格式,兼顾可读性、精度(如 bigint 表示 int64)与性能,旨在替代 JSON、Protobuf 等传统序列化方案。

截屏2026-05-18 23.28.54.png
截屏2026-05-18 23.30.29.png

在TypeScript和JavaScript如何使用MetaMessage?

本來是不報信心的,因為ts和js天生類型缺失,作為一個動態語言,number既不是int也不是bigint,開始設計的時候想了挺長時間。

還好,確認了ts是支持裝飾器的,雖然也寫過很多前端項目,卻從來沒有用過這個裝飾器。既然有裝飾器,那就非常適合MetaMessage改造,簡單的方式就可以把值進行轉換。對於一些類型,為了不丟失精度,int/int64/uint/uint64需要用bigint來表示,這點需要注意。

看一個例子:

import {
    encodeFromJsonc, decodeToJsonc } from 'metamessage';

@mm({
    desc: '用户' })
class User {
   
  @mm({
    type: ValueType.Int64, desc: '用户ID' })
  id: bigint = 0n;

  @mm({
    desc: '昵称', nullable: false })
  name: string = '';

  @mm({
    type: ValueType.Uint8, desc: '年龄' })
  age: number = 0;
}

const u = new User();
u.id = 666n;
u.name = 'abc';
u.age = 20;

const wire = encodeFromValue(u);
console.log('wire', wire);

const decoded = decodeToValue(wire, User);
console.log('decoded', decoded);

const jsonc = `
// mm: desc="用户"
{
  // mm: type=i64; desc="用户ID"
  "id": 666,

  // mm: desc="昵称"
  "name": "abc",

  // mm: type=u8
  "age": 20
}
`;

const wire = encodeFromJsonc(jsonc);
const jsoncString = decodeToJsonc(wire);
console.log('JSONC result:\n', jsoncString);

上面用一個mm裝飾器來包裹mm的標籤,desc可以描述字段信息,用戶可以從中了解輸出的數據意義。
特殊的類型 比如ValueType.Int64是需要標注的,這樣類型極少的js也可以表示複雜的數據類型了。
nullable代表數據是否可以為空,這在請求描述上特別有用,nullable說明字讀是可選的,當然可以搭配allow_empty,效果更佳。

說下這裡的jsonc,這是一種mm可以表示的文本形式,各語言可能數據對象不一致,但如果輸出jsonc,相同語意的jsonc是一致的。所以各語言間是可以表示相同語意的,且不會出錯。

wire是一種序列化的二進制形式,佔用空間小,也方便解析,可以在網絡傳輸中直接用它。

MetaMessage目前已經支持不少語言了。不過還有很多語言支持在路上,未來作為一種各語言間理想的數據交換工具,一定會流行開來。

替代傳統的json、protobuf、messagePack等老舊協議指日可待。

目录
相关文章
|
6月前
|
JavaScript 文件存储 数据安全/隐私保护
打造你的私人电子书王国:Talebook 项目全面介绍
Talebook 以其简洁的部署、优雅的界面和强大的功能,成为了这个领域不可多得的好项目。
1192 127
|
5月前
|
存储 弹性计算 负载均衡
阿里云巨型帧是什么?云服务器ECS支持规格、开启关闭及配置步骤问题解答FAQ
阿里云巨型帧(Jumbo Frames)支持8500字节超大以太网帧,突破传统1500字节限制,可显著减少数据包数量、降低CPU负载、提升网络吞吐与大块数据传输效率,适用于HPC、大数据、SAN等高带宽场景。详细参考云服务器ECS官网解读:https://t.aliyun.com/U/AZBUsA
671 123
|
6月前
|
机器学习/深度学习 人工智能 自然语言处理
Agent = Model + Harness:模型决定上限Harness 决定下限
Claude Code、Cursor等并非聊天界面,而是AI编码的“操作系统”——Harness。它决定模型能否稳定执行规则、调用工具、管理上下文与权限。模型定上限,Harness定下限。差异常源于Harness配置,而非模型本身。
874 5
|
4月前
|
缓存 Rust 安全
Nolang 硬核技术白皮书:全方位内核级超越 Rust(纯语言机制对比)
Nolang 是新一代无GC内存安全语言,首创“延迟所有权”模型:赋值直觉、零生命周期负担、函数末尾批量内存回收,性能与安全全面超越Rust。当前生态尚小,但内核、架构与开发体验已实现碾压式领先。(239字)
354 3
|
5月前
|
API
阿里云微服务引擎 MSE 及 API 网关 2026 年 5 月产品动态
阿里云微服务引擎 MSE 及 API 网关 2026 年 5 月产品动态。
334 41
|
5月前
|
存储 人工智能 算法
告别无效刷屏!TrendRadar:最快30秒部署的开源热点助手,让你只看真正关心的新闻
TrendRadar 是一个轻量级、易部署的热点新闻聚合与推送工具。它能够从知乎、抖音、B站、微博、百度、华尔街见闻等11个主流平台抓取热搜榜单,然后根据你设定的关键词进行智能筛选,最终将你最关心的内容推送到手机或邮箱。
1154 13
 告别无效刷屏!TrendRadar:最快30秒部署的开源热点助手,让你只看真正关心的新闻
|
8月前
|
存储 C语言 内存技术
C语言深度解析:大小端字节序——多字节数据的底层存储规则
大小端指CPU对多字节数据在内存中的存放顺序:大端高字节存低地址,小端反之。x86/ARM默认小端,网络字节序统一为大端。跨平台、网络通信、二进制协议开发中必须显式处理字节序转换,否则数据解析必错。
1402 138
|
5月前
|
存储 弹性计算 负载均衡
阿里云巨型帧Jumbo Frames配置手册:ECS云服务器实例规格族支持、开启关闭、MTU设置教程
阿里云巨型帧(Jumbo Frames)支持8500字节MTU,可提升吞吐量、降低CPU负载,适用于HPC、大数据、SAN等场景。g8i/c8i/r8i及9代等主流实例规格默认支持,需全链路设备协同配置,避免分片风险。详细参考阿里云服务器ECS官网链接:https://t.aliyun.com/U/AZBUsA
462 1
|
5月前
|
机器学习/深度学习 数据采集 人工智能
田间杂草检测数据集分享(适用于YOLO系列深度学习分类检测任务)
本数据集含4000张真实农田图像(小麦/玉米/水稻田),YOLO格式标注杂草目标,覆盖多天气、光照与视角,适用于YOLO系列等目标检测模型训练,助力智能除草与精准农业研究。(239字)
612 16