在TypeScript和JavaScript如何使用MetaMessage?
【摘要】 在TypeScript和JavaScript如何使用MetaMessage?本來是不報信心的,因為ts和js天生類型缺失,作為一個動態語言,number既不是int也不是bigint,開始設計的時候想了挺長時間。還好,確認了ts是支持裝飾器的,雖然也寫過很多前端項目,卻從來沒有用過這個裝飾器。既然有裝飾器,那就非常適合MetaMessage改造,簡單的方式就可以把值進行轉換。對於一些類型,...


在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等老舊協議指日可待。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)