JSON 스키마와 TypeScript 표준 정렬

20403 단어 apitypescriptnodejson
현재 작업에서 저는 여러 대규모 프로젝트에서 특정 표준을 시행하는 방법을 찾고 있습니다.

이는 유연하고 확장 가능하며 최신 상태로 유지되는 여러 언어에 걸쳐 설정된 표준을 의미합니다.

곧 있을 게시물 중 일부는 json-schema-to-typescript 라이브러리를 시작으로 조사로 수행 중인 스파이크 중 일부를 조사할 것입니다.

JSON 스키마



JSON 스키마란 무엇입니까? 다음은 JSON Schema Org site의 정의입니다.

JSON Schema is a powerful tool for validating the structure of JSON data.



JSON 스키마 및 Open API 도구를 사용하여 마이크로 서비스를 구조화하고 "저렴한"계약 테스트를 제공할 수 있기를 바랍니다.

프로젝트 설정




mkdir json-schema-ts-spike
cd json-schema-ts-spike

# start a yarn project with default settings
yarn init -y
yarn add json-schema-to-typescript jsonschema

# setup files we will use
touch index.js book.json


소스에서 컴파일



내 예에서는 특정 파일에서 읽어서 생성하도록 선택합니다.

const Validator = require("jsonschema").Validator
const { compile, compileFromFile } = require("json-schema-to-typescript")
const fs = require("fs")
const path = require("path")

const main = async () => {
  // validate the schema first
  const v = new Validator()

  // read the schema details
  const schemaFilepath = path.join(__dirname, "book.json")
  const bookSchema = JSON.parse(fs.readFileSync(schemaFilepath, "utf-8"))

  // read the example
  const exampleJsonFilepath = path.join(__dirname, "example.json")
  const exampleJson = JSON.parse(fs.readFileSync(exampleJsonFilepath, "utf-8"))

  v.addSchema(bookSchema, "/BookSchema")
  const validation = v.validate(exampleJson, bookSchema)

  if (validation.errors.length) {
    console.log(validation.errors)
    process.exit(1)
  }

  // compile from file
  const ts = await compileFromFile(schemaFilepath)
  fs.writeFileSync("book.d.ts", ts)
}

main()


이것은 우리 예제에 필요한 모든 코드가 될 것입니다.

JSON 스키마 파일



이 파트에서는 ​​기본 책과 컬렉션을 모델링해 보겠습니다. 일부 스키마 정보book.json 파일을 추가해야 합니다.

JSON 스키마를 사용한 모델링 자체에 대해 너무 깊이 들어가지는 않겠지만 다음과 같은 정의가 나옵니다.

{
  "$schema": "http://json-schema.org/draft-07/schema#",

  "definitions": {
    "user": {
      "type": "object",
      "properties": {
        "name": { "type": "string" },
        "preferredName": { "type": "string" },
        "age": { "type": "string" },
        "gender": { "enum": ["male", "female", "other"] }
      },
      "required": ["name", "preferredName", "age", "gender"]
    },
    "author": {
      "type": "object",
      "properties": {
        "allOf": [{ "$ref": "#/definitions/address" }]
      }
    }
  },
  "type": "object",
  "properties": {
    "author": { "$ref": "#/definitions/author" },
    "title": { "type": "string" },
    "publisher": { "type": "string" }
  },
  "required": ["author", "title", "publisher"]
}


책 JSON



테스트할 수 있는 기본example.json 파일에 몇 가지 정보를 추가해 보겠습니다.

{
  "author": {
    "name": "Dennis O'Keeffe",
    "preferredName": "Dennis",
    "age": 28,
    "gender": "male"
  },
  "title": "The Greatness Of Strict Schemas",
  "publisher": "Real Publisher (definitely not fake)"
}


우리의 창조물 실행하기



루트 디렉토리에서 node index.js를 실행하십시오.

당신은 실제로 내가 거기에 실수를 남겼다는 것을 알게 될 것입니다! 다음은 로그아웃됩니다.

> node index.js
[
  ValidationError {
    property: 'instance.author.age',
    message: 'is not of a type(s) string',
    schema: { type: 'string' },
    instance: 28,
    name: 'type',
    argument: [ 'string' ],
    stack: 'instance.author.age is not of a type(s) string'
  }
]


우리의 검증(또는 무효화 자체)은 성공적이었습니다! 스키마에서 문자열이어야 한다고 말했지만 번호28를 받았습니다.
book.json로 돌아가서 값을 number 유형으로 변환합니다. 이제 다시 실행하면node index.js 약간의 성공을 거둘 것입니다! books.d.ts 파일이 작성되었음을 알 수 있습니다.

You might be wondering why I am writing this blog post in js to generate TypeScript types. Honestly, when I am doing spikes I normally just write quick scripts and keep out the fluff.



다음이 생성되는 것을 볼 수 있습니다.

/* tslint:disable */
/**
 * This file was automatically generated by json-schema-to-typescript.
 * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
 * and run json-schema-to-typescript to regenerate this file.
 */

export interface BookSchema {
  author: User
  title: string
  publisher: string
  [k: string]: unknown
}
export interface User {
  name: string
  preferredName: string
  age: number
  gender: "male" | "female" | "other"
  [k: string]: unknown
}


훌륭한 성공! 이제 가져올 수 있는 스키마 유형이 있습니다.

리소스 및 추가 읽을거리


  • jsonschema - GitHub
  • JSON Schema - Structuring A Complex Schema

  • 이미지 크레디트: Tony Pham

    원래 내blog에 게시되었습니다. 더 많은 숨겨진 보석을 보려면 Twitter에서 저를 팔로우하십시오.

    좋은 웹페이지 즐겨찾기