如何在 json 解析后根据对象类型对字符串进行类型检查
How to typecheck a string against an object type after json parse
我有一些类型:
export type Ping = {
kind: 'ping',
lag?: number
}
export type Message = {
kind: 'message',
value: string
}
我有一个传入的消息字符串编码 json:
let msg = "{kind:'message', value: 3 }",
ping = "{kind:'ping'}";`;
我将其转换为对象后:
let obj = JSON.parse(msg);
我想验证这些消息是否具有预期的属性并像这样发送它们:
export function isMessage(_: any): _ is Message {
if (typeof _ === 'object') {
let res = (_ as Message);
if (res.kind === 'message' && res.value && typeof res.value === 'string') {
return true;
}
}
return false;
}
export function use(_: any) {
if (isMessage(_)) {
console.log('Message: ', _.value);
}
}
我是否必须像上面那样对每种消息的每个字段进行类型检查,或者有更简单的方法吗?
更简单或至少更清晰的方法是编写 JSON Schema and run your data through a validator like ajv。以下是验证您的 Message
类型的方法:
import Ajv, { JSONSchemaType } from 'ajv';
const ajv = new Ajv();
export interface Message {
kind: 'message',
value: string
}
const messageSchema: JSONSchemaType<Message> = {
type: 'object',
properties: {
kind: { type: 'string', const: 'message' },
value: { type: 'string' }
},
required: ['kind', 'value'],
additionalProperties: false
};
const isMessage = ajv.compile(messageSchema);
export { isMessage };
我有一些类型:
export type Ping = {
kind: 'ping',
lag?: number
}
export type Message = {
kind: 'message',
value: string
}
我有一个传入的消息字符串编码 json:
let msg = "{kind:'message', value: 3 }",
ping = "{kind:'ping'}";`;
我将其转换为对象后:
let obj = JSON.parse(msg);
我想验证这些消息是否具有预期的属性并像这样发送它们:
export function isMessage(_: any): _ is Message {
if (typeof _ === 'object') {
let res = (_ as Message);
if (res.kind === 'message' && res.value && typeof res.value === 'string') {
return true;
}
}
return false;
}
export function use(_: any) {
if (isMessage(_)) {
console.log('Message: ', _.value);
}
}
我是否必须像上面那样对每种消息的每个字段进行类型检查,或者有更简单的方法吗?
更简单或至少更清晰的方法是编写 JSON Schema and run your data through a validator like ajv。以下是验证您的 Message
类型的方法:
import Ajv, { JSONSchemaType } from 'ajv';
const ajv = new Ajv();
export interface Message {
kind: 'message',
value: string
}
const messageSchema: JSONSchemaType<Message> = {
type: 'object',
properties: {
kind: { type: 'string', const: 'message' },
value: { type: 'string' }
},
required: ['kind', 'value'],
additionalProperties: false
};
const isMessage = ajv.compile(messageSchema);
export { isMessage };