验证 JSON 是不是匹配类型

Posted

技术标签:

【中文标题】验证 JSON 是不是匹配类型【英文标题】:Validate if JSON matches type验证 JSON 是否匹配类型 【发布时间】:2022-01-16 23:33:03 【问题描述】:

如果是 JSON,我会在表单上的 Angular 应用程序中获取一些序列化信息。我想检查事件属性名称是否是我的预定义字符串之一。

事件名称类型:

EventName =
  'appInfo' |
  'connectivity' |
  'location' |
  'pushNotification' |
  'newVersion';
const foo: EventName = 'appInfo';
const bar: EventName = 'appInfos'; // error
const baz: EventName = JSON.parse('appInfos'); // no error
    
// validation
const nameValid = [
  'appInfo', 
  'connectivity', 
  'location', 
  'pushNotification', 
  'newVersion'
].includes(baz) // works, but I would need to change things here and in type if something changes

【问题讨论】:

【参考方案1】:

根据@bherbruck 的回答,我将 EventName 从类型更改为枚举。 所以我的枚举看起来像

enum EventName 
  AppInfo = 'appInfo',
  Connectivity = 'connectivity',
  Location = 'location',
  PushNotification = 'pushNotification',
  NewVersion = 'newVersion'

验证是

... && Object.values(EventName).includes(this.name);

【讨论】:

【参考方案2】:

如果您只想将字符串保存在一个位置,可以将它们放入数组as const,然后从数组中派生出typeof

const EVENT_NAMES = [
  'appInfo',
  'connectivity',
  'location',
  'pushNotification',
  'newVersion',
] as const;

type EventName = typeof EVENT_NAMES[number];

const foo: EventName = 'appInfo';
const bar: EventName = 'appInfos'; // error
const baz: EventName = JSON.parse('appInfos'); // no error

EVENT_NAMES.includes(baz);

EventName 类型将是:

const EVENT_NAMES: readonly ["appInfo", "connectivity", "location", "pushNotification", "newVersion"]

【讨论】:

以上是关于验证 JSON 是不是匹配类型的主要内容,如果未能解决你的问题,请参考以下文章

验证 POST JSON 正文匹配结构

为啥此字段验证类型不匹配?

如何使用 CodeIgniter 的表单验证类验证“不匹配”类型?

使用soapui验证JSON

如何正确验证表单中带有 symfony json 约束的学说类型“json”?

BigQuery JSON 架构验证