TypeScript中如何定义可被JSON.stringify处理的类型?
处理JSON可序列化值的TypeScript类型定义
完全不用any,你可以自己定义一个覆盖所有JSON可序列化值的类型,比any更安全,还能在编译阶段帮你排查JSON.stringify处理不了的参数。
JSON能正确序列化的类型范围很明确:
- 原始类型:
string、number、boolean、null(undefined、Symbol、函数会被忽略或序列化失败) - 由上述原始类型组成的数组
- 键为字符串、值为上述类型的对象
基于这个规则,可以写出对应的TypeScript类型:
// JSON支持的原始类型 type JsonPrimitive = string | number | boolean | null; // 递归定义合法的JSON值:原始类型、对象或数组 type JsonValue = JsonPrimitive | JsonObject | JsonArray; // JSON对象:键是string,值为合法JSON值 interface JsonObject { [key: string]: JsonValue; } // JSON数组:元素为合法JSON值 interface JsonArray extends Array<JsonValue> {}
之后直接把这个类型用在函数参数里就行:
function serializeValue(value: JsonValue) { return JSON.stringify(value); }
这样做的好处是,如果你传入函数、undefined或者Symbol这类JSON处理不了的值,TypeScript会在编译阶段直接报错,避免运行时的意外问题。
需要注意的是,这个类型没法检测循环引用的情况——循环引用属于运行时问题,静态类型检查没法提前发现,但已经能覆盖绝大多数合法的JSON可序列化场景了。
内容的提问来源于stack exchange,提问作者Antrikshy
相关产品推荐
相关产品推荐

