如何在 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 };