如何使用 TypeScript 实现对象验证?

Kit*_*ori 5 javascript typescript ecmascript-6

我有一个 Express API 服务器应用程序和一个 React 客户端应用程序,它们都在 TypeScript 中实现。我使用 TypeScript 接口定义了我的数据模型,并且我在系统的两端都使用了这些接口。但是,TypeScript 接口只是编译时功能,我还需要运行时类型检查,例如验证 HTTP POST 数据 (json) 是否符合定义的数据结构。

所以我的问题是,我可以/应该如何利用 TypeScript 提供的功能来实现运行时对象验证?

Avi*_*rmi 2

我创建了一个名为“烟幕”的超轻量级库,它正是这样做的。它利用 typescript 功能在 javascript 运行时执行任何类型的对象验证。由于 javascript 在运行时不保存任何类型信息,因此它不是 100% 无缝的,但由于 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
Run Code Online (Sandbox Code Playgroud)

可以设置其他自定义验证器,还支持和强制执行可选参数和空检查。我建议您阅读更多相关内容并尝试一下。