ts 界面检查器
运行时库可以对照TypeScript接口验证数据.
此软件包是运行时对校验器的支持 ts- 界面构建器。 。 。 . 它允许验证数据, 例如解析收到的 JSON 对象 覆盖网络,或解析 JSON 或 YAML 文件,以检查它们是否满足 TypeScript 接口, 并生成信息性错误消息 .
安装
npm install --save-dev ts-interface-builder
npm install --save ts-interface-checker
使用量
假设您有定义接口的 TypeScript 文件 :
// foo.ts
interface Square {
size: number;
color?: string;
}
第一步是生成一些运行时间检查代码:
`npm bin`/ts-interface-builder foo.ts
它会产生这样的文件:
// foo-ti.js
import * as t from "ts-interface-checker";
export const Square = t.iface([], {
"size": "number",
"color": t.opt("string"),
});
...
现在运行时, 检查一个值是否满足了 Square 界面 :
import fooTI from "./foo-ti";
import {createCheckers} from "ts-interface-checker";
const {Square} = createCheckers(fooTI);
Square.check({size: 1}); // OK
Square.check({size: 1, color: "green"}); // OK
Square.check({color: "green"}); // Fails with "value.size is missing"
Square.check({size: 4, color: 5}); // Fails with "value.color is not a string"
请注意: ts-interface-builder 仅是建时步骤需要
ts-interface-checker 运行时需要。 这就是为什么建议Npm -inll
前一个使用 --save-dev 旗并使用 --save。 。 。 .
检查方法调用
如果与方法有接口,可以验证方法调用参数并返回值:
// greet.ts
interface Greeter {
greet(name: string): string;
}
在生成运行时代码后,您现在可以检查诸如:
import greetTI from "./greet-ti";
import {createCheckers} from "ts-interface-checker";
const {Greeter} = createCheckers(greetTI);
Greeter.methodArgs("greet").check(["Bob"]); // OK
Greeter.methodArgs("greet").check([17]); // Fails with "value.name is not a string"
Greeter.methodArgs("greet").check([]); // Fails with "value.name is missing"
Greeter.methodResult("greet").check("hello"); // OK
Greeter.methodResult("greet").check(null); // Fails with "value is not a string"
类型套房
如果一个类型指另一个文件中定义的类型,则需要告诉界面检查器有关
调用时所有类型名称 createCheckers(). 例如给定
// color.ts
export type Color = RGB | string;
export type RGB = [number, number, number];
// shape.ts
import {Color} from "./color";
export interface Square {
size: number;
color?: Color;
}
生成的文件 color-ti.ts 财务报告和审定财务报表 shape-ti.ts 不自动提及对方,但
期待你把他们联系起来 createCheckers() 电话 :
import color from "./color-ti";
import shape from "./shape-ti";
import {createCheckers} from "ts-interface-checker";
const {Square} = createCheckers(shape, color); // Pass in all required type suites.
Square.check({size: 1, color: [255,255,255]});
严格检查
您可以检查该数据中没有额外的属性 。 请注意,一般不建议 它防止了后向相容性:如果将新属性添加到接口中,那么会更旧 严格检查的代码不会接受.
以上述例子如下:
Square.strictCheck({size: 1, color: [255,255,255], bg: "blue"}); // Fails with value.bg is extraneous
Square.strictCheck({size: 1, color: [255,255,255,0.5]}); // Fails with ...value.color[3] is extraneous
类型警卫
标准 Checker 对象进行类型检查逻辑,但无法制作类型脚本
编译器意识到对象 unknown 类型执行某个接口.
基本代码 :
const unk: unknown = {size: 1, color: "green"};
// Type is unknown, so TypeScript will not let you access the members.
console.log(unk.size); // Error: "Object is of type 'unknown'"
与一个 Checker 备注:
import fooTI from "./foo-ti";
import {createCheckers} from "ts-interface-checker";
const {Square} = createCheckers(fooTI);
const unk: unknown = {size: 1, color: "green"};
if (Square.test(unk)) {
// unk does implement Square, but TypeScript is not aware of it.
console.log(unk.size); // Error: "Object is of type 'unknown'"
}
启用现有类型守护功能 test,以及 strictTest 函数, Checker
对象应被投放到 CheckerT<> 使用合适的类型.
使用 CheckerT<>数字 :
import {Square} from "./foo";
import fooTI from "./foo-ti";
import {createCheckers, CheckerT} from "ts-interface-checker";
const {Square} = createCheckers(fooTI) as {Square: CheckerT<Square>};
const unk: unknown = {size: 1, color: "green"};
if (Square.test(unk)) {
// TypeScript is now aware that unk implements Square, and allows member access.
console.log(unk.size);
}
类型断言
CheckerT<> 最终将使用 check 财务报告和审定财务报表 strictCheck 函数,
然而,这个功能还没有在TypeScript中完全工作.