我有一个Express API服务器应用程序和一个React客户端应用程序,它们都是用TypeScript实现的。我使用TypeScript接口定义了我的数据模型,并且在系统的两端都使用了这些接口。然而,TypeScript接口只是编译时特性,我还需要运行时类型检查,例如验证HTTP POST data (json)是否符合定义的数据结构。
所以我的问题是,我如何能够/应该利用TypeScript提供的功能来实现运行时对象验证?
发布于 2018-03-24 23:18:49
我已经创建了一个名为Smoke Screen的超轻量级库,它就是这样做的。它利用typescript特性在javascript运行时执行任何类型的对象验证。它不是100%无缝的,因为javascript在运行时不保存任何类型信息,但多亏了TypeScript装饰器,这可能很容易做到:
class Person {
@exposed({type: Number})
age: number;
}
// serialize a Person object into a JSON string
const person = new Person();
person.age = 56.8;
const smokeScreen = new SmokeScreen();
smokeScreen.toJSON(person); // -> '{"age":56.8}'
// deserialize a JSON string into a Person object
let json = JSON.stringify({age: 19});
const person2 = smokeScreen.fromJSON(json, Person);
console.log(person2); // -> Person { age: 19 }
// typing validation
json = JSON.stringify({age: "oops"});
smokeScreen.fromJSON(json, Person); // Error: illegal input - property 'age' must be a number
可以设置其他自定义验证器,还支持并强制执行可选参数和null检查。我建议阅读更多关于它的知识,并尝试一下。
发布于 2020-03-10 05:54:27
我知道这个问题已经过时了,但我刚刚使用装饰器为JSON对象和typescript编写了自己的验证器。可在此处获得:ts-json-object
示例:
import {JSONObject,required,optional,lt,gte} from 'ts-json-object'
class Person extends JSONObject {
@required // required
name: string
@optional // optional!
@lt(150) // less than 150
@gte(0) // Greater or equal to 0
age?: number
}
let person = new Person({
name: 'Joe'
}) // Ok
let person = new Person({
}) // Will throw a TypeError, because name is required
let person = new Person({
name: 123
}) // Will throw a TypeError, because name must be a string
具有许多其他功能,如自定义验证等。
https://stackoverflow.com/questions/44297397
复制相似问题