Проверьте схему Json с динамическими ключами в Typescript - PullRequest
0 голосов
/ 01 октября 2019

У меня есть папка 'schemas', которая содержит разные файлы JSON для хранения разных схем.

Например,

/ schemas / apple-schema.json

{
  "$schema": "http://json-schema.org/draft-06/schema",
  "type": "object",
  "properties": {
    "apple_name": {
      "type": "string"
    },
    "id": {
      "type": "integer"
    },
    "apple_weight": {
      "type": "number"
    },
    "timestamp": {
      "type": "string",
      "format": "date-time"
    },
    "required": ["id"]
  }
}

/ schemas / mango-schema.json

{
  "$schema": "http://json-schema.org/draft-06/schema",
  "type": "object",
  "properties": {
    "mango_name": {
      "type": "string"
    },
    "id": {
      "type": "integer"
    },
    "mango_mature": {
      "type": "number"
    },
    "mango_age": {
      "type": "number"
    },
    "mango_timestamp": {
      "type": "string",
      "format": "date-time"
    },
    "required": ["id"]
  }
}

Разноесхемы имеют разные ключи. Ниже я хочу проверить следующее:

  1. Ключи (например, apple_name, id, timestamp, mango_name, mango_mature, mango_age и т. Д.) Среди всех схем следуют одному и тому же соглашению об именах (строчные буквы сподчеркивание: «xxx» или «xxx_yyy»).

  2. Любой ключ, имя которого содержит «отметку времени», должен иметь формат «дата-время»

  3. В любой схеме должен существовать ключ 'id'. (Ключ 'id' необходим для всех схем)

Можно ли написать модульный тест, который импортирует все схемы JSON и обрабатывает проверки?

1 Ответ

0 голосов
/ 01 октября 2019

Вам необходим JSON Schema Validator, такой как Ajv , чтобы выполнять проверку схемы во время выполнения вместо функций TypeScript.

Возможно, вы захотите написать некоторые определения типов для этой фруктовой схемы впомочь вам при кодировании в ситуации безопасности типов.

TypeScript обеспечивает статическую проверку типов, которая убирается во время компиляции и не существует во время выполнения. Таким образом, вы не можете проверить тип во время выполнения.


По вашему требованию:

  1. Проверка соответствия имени

Youможет сделать это с помощью регулярного выражения.

Любая схема должна существовать, ключ 'id'

Вот что может предложить вам TypeScript:

interface Schema {
  id: number;
}

interface AppleSchema extends Schema {
  apple_name: string,
  apple_weight: number,
  // rest properties...
}

interface MongoSchema extends Schema {
  mango_name: string,
  mango_mature: number,
  // rest properties...
}

// enjoy the power of TypeScript
export function testApple(apple: AppleSchema) {
  console.log(apple.id); // now you can access apple.id, apple.apple_name, apple.apple_weight ...
}

// even more
export function findFruit<T extends Schema>(fruits: T[], id: number) {
    return fruits.find(fruit => fruit.id === id)
}
...