JSON 스키마와 TypeScript 표준 정렬
이는 유연하고 확장 가능하며 최신 상태로 유지되는 여러 언어에 걸쳐 설정된 표준을 의미합니다.
곧 있을 게시물 중 일부는
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
}
훌륭한 성공! 이제 가져올 수 있는 스키마 유형이 있습니다.
리소스 및 추가 읽을거리
이미지 크레디트: Tony Pham
원래 내blog에 게시되었습니다. 더 많은 숨겨진 보석을 보려면 Twitter에서 저를 팔로우하십시오.
Reference
이 문제에 관하여(JSON 스키마와 TypeScript 표준 정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/okeeffed/align-typescript-standards-with-json-schema-29h0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)