使用TypeScript校验运行时数据

简介: 对于前端程序猿,常见的开发流程是:1.前后端约定接口2.后端给出接口文档3.根据接口编写 TypeScript 类型定义4.开发完成进行联调

虽然一切顺利,但是上线后还是翻车了,js 报错:cannot read the property 'xx' of null,很显然前端没有处理空值,接锅吧 TT。但回头一看接口文档,跟后端同学约定的返回对象,但实际返了 null,这锅不能一个人背。那么怎样才能尽早发现这种问题呢?一种解决方案是:

将 TypeScript 类型定义转为 JSON Schema
利用 JSON Schema 校验数据正确性

JSON Schema
JSON Schema 是一个 JSON 对象,用来描述和校验 JSON 对象的格式。比如下面这个 JSON Schema:

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "age": {
      "type": "number"
    },
    "hobby": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "age",
    "hobby",
    "name"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
}

它描述了这样一个 JSON 对象:

类型 - type 是obeject
有四个属性 - properties

name:类型为 string
age:类型为 number
hobby:类型为 Array
属性是否必须 - required:name,age,hobby 都为必须
下面这个 JSON 对象就是满足这个 JSON Schema 的:

{
  "name": "Tom",
  "age": 1,
  "hobby": ["coding"]
}

可以看出 JSON Schema 还是很好理解的,但其描述语法还是有一定学习成本,这里强烈推荐通过 jsonschema 库的 example 去学习相关语法,另外也可以看 Understanding JSON Schema。

有了 JSON Schema,怎么使用它校验 JSON 对象的合法性呢?这里就用到了刚刚提到的jsonschema 库。简单使用示例如下:

var Validator = require('jsonschema').Validator;
var v = new Validator();
var instance = 4;
var schema = {"type": "number"};
console.log(v.validate(instance, schema));

现在可以根据 JSON Schema 去校验后端返回数据的格式是否正确了,但是为每个接口手动编写 JSON Schema 是不现实的,我们自然会想到能不能将 TypeScript 的接口类型定义转为 JSON Schema?

TypeScript Interface -> JSON Schema
好在已经有 typescript-json-schema 这个库帮我们解决了这个问题,下面给出简单的使用示例:

import path from "path";
import * as TJS from "typescript-json-schema";

const settings: TJS.PartialArgs = {
  required: true
};

// optionally pass ts compiler options
const compilerOptions: TJS.CompilerOptions = {
  strictNullChecks: true
};

// 解析接口定义文件:index.ts
const program = TJS.getProgramFromFiles(
  [path.join(__dirname, './apis/index.ts')],
  compilerOptions,
);

// 将"IApi1"这个interface转为schema,传入"*"将转换全部interface
let schema = TJS.generateSchema(program, "IApi1", settings) || {};

一顿操作后就可以将下面这个 interface 转为文章开头给出的示例 JSON Schema:

interface IApi1 {
  name: string;
  age: number;
  hobby: string[];
}

然后再用 node 将刚刚得到的 schema 存成 json 文件:

fs.writeFileSync(path.join(__dirname, "./json-schema", "schema.json"), schema); 

接着就可以使用相应的 JSON Schema 对后端数据进行校验了:

import { Validator } from 'jsonschema'

const apiSchema = require('./json-schema/schema.json')
const v = new Validator();
Api1().then(res => { 
  const validateRes1 = v.validate(res, apiSchema)
  console.log(validateRes1);
});

如果你想开发小程序或者了解更多小程序的内容,可以通过第三方专业开发平台,来帮助你实现开发需求:厦门在乎科技-专注小程序开发、厦门app定制开发、网站开发、H5小游戏开发

相关文章
|
2月前
|
缓存 JavaScript 前端开发
【TypeScript技术专栏】TypeScript与GraphQL数据交互
【4月更文挑战第30天】本文探讨了在TypeScript中使用GraphQL进行数据交互的优势和方法。GraphQL作为一种API查询语言,解决了REST API的过度获取和欠获取问题,允许客户端按需请求数据。结合TypeScript,可以构建强类型、高效的前端数据层。文章涵盖了GraphQL简介、为何选择GraphQL、在TypeScript中的使用、查询和变异、相关工具库以及最佳实践。通过案例分析,展示了GitHub、Shopify和The New York Times等大公司如何成功应用这一技术组合。学习并掌握GraphQL和TypeScript将提升开发者的技术能力和项目效率。
|
11月前
|
JavaScript 前端开发
如何在vscode上直接运行typescript
如何在vscode上直接运行typescript
718 0
|
2月前
|
JavaScript
TypeScript 实现扑克数据花色、数值获取和生成
TypeScript 实现扑克数据花色、数值获取和生成
|
9月前
|
JavaScript 前端开发
TypeScript 可以编译成纯 JavaScript,并且可以在任何浏览器上运行,具体应用案例解析
TypeScript 可以编译成纯 JavaScript,并且可以在任何浏览器上运行,具体应用案例解析
71 1
|
9月前
|
存储
TypeScript-运行时和常量枚举
TypeScript-运行时和常量枚举
36 0
|
11月前
|
JavaScript
【typescript入门手册】ts函数可选参数-未使用—ESlint 校验
【typescript入门手册】ts函数可选参数-未使用—ESlint 校验
253 0
|
12月前
|
JavaScript 前端开发
【TypeScript】原始数据的类型详解概念
【TypeScript】原始数据的类型详解概念
|
JavaScript 前端开发 IDE
TypeScript学习笔记(一)TS介绍,环境安装与运行
TypeScript学习笔记(一)TS介绍,环境安装与运行
88 0
TypeScript学习笔记(一)TS介绍,环境安装与运行
|
JavaScript
VSCode插件 code runner运行TypeScript
VSCode插件 code runner运行TypeScript
1170 0
VSCode插件 code runner运行TypeScript
typescript28-枚举类型的值以及数据枚举
typescript28-枚举类型的值以及数据枚举
79 0
typescript28-枚举类型的值以及数据枚举