在运行时针对TypeScript中的接口验证"任何"对象

Tri*_*Gao 12 validation ajax datacontract typescript

我正在使用typescript处理应用程序的UI.与此同时,其他人也在为我提供数据.我们就数据合同达成了一致意见,但是这个过程很容易出错,我不断从服务器获取无效的数据对象.所以我的问题是我可以使用typescript中定义的一些接口以某种方式验证动态对象(在运行时)吗?


这个问题是在2012年提出的,因此它不能重复检查一个对象是否在运行时使用 2015年提出的TypeScript实现了一个接口.

小智 8

就目前而言,TypeScript接口纯粹是编译时实体,因此无法进行任何类型的运行时验证,更不用说甚至知道编译时存在哪些接口.因此,答案似乎是以下之一:

  1. 编写一些工具将TypeScript接口转换为可用于验证对象的某些运行时对象表示,或者:
  2. 将TypeScript接口复制为某些运行时对象表示

您可以使用JSON-schema作为运行时表示,因为Github上存在许多验证器.一个TypeScript接口 - > JSON Schema转换器是我希望有人在某些时候做出的,但据我所知,目前还不存在.

  • 这是我刚刚为您制作的基本TypeScript接口→JSON-Schema转换器:https://github.com/ysangkok/typescript-interface-to-jsonschema (5认同)

Val*_*tin 6

正如Brian所指出的,接口仅在编译时表现出来,并被编译器用作所谓的命名类型.语言规范的第7节描述如下:

接口没有运行时表示 - 它们纯粹是编译时构造.接口对于记录和验证所需的属性形状,作为参数传递的对象以及从函数返回的对象特别有用.

在进一步向下规范的7.4节中有打字稿动态类型检查的一个很好的描述:

TypeScript不提供动态测试对象是否实现特定接口的直接机制.相反,TypeScript代码可以使用JavaScript技术检查对象上是否存在适当的成员集...

规范中的示例定义了三个接口:

interface Mover {
    move(): void;
    getStatus(): {speed: number;};
}

interface Shaker {
    shake(): void;
    getStatus(): {frequency: number;};
}

interface MoverShaker extends Mover, Shaker {
    getStatus(): { speed: number; frequency: number; }; 
}
Run Code Online (Sandbox Code Playgroud)

MoverShaker结合MoverShaker进入新的复合界面.要在运行时验证给定类型是否满足接口MoverShaker,您可以使用以下Javascript代码:

var obj: any = getSomeObject();
if (obj && obj.move && obj.shake && obj.getStatus) {
    var moverShaker = <MoverShaker> obj;
    ...
}
Run Code Online (Sandbox Code Playgroud)

要在Typescript中进行编译时检查,您需要为应用程序的两个部分之间交换的类型定义接口.目前,您必须手动编写动态检查代码(如上所述).因此,如果您忘记同步更新它们,静态类型和动态检查代码可能会在某些时候偏离.正如Brian指出的那样,拥有一个自动生成代码的工具会很不错.


归档时间:

查看次数:

7370 次

最近记录:

6 年,5 月 前