Tri*_*Gao 12 validation ajax datacontract typescript
我正在使用typescript处理应用程序的UI.与此同时,其他人也在为我提供数据.我们就数据合同达成了一致意见,但是这个过程很容易出错,我不断从服务器获取无效的数据对象.所以我的问题是我可以使用typescript中定义的一些接口以某种方式验证动态对象(在运行时)吗?
这个问题是在2012年提出的,因此它不能重复检查一个对象是否在运行时使用 2015年提出的TypeScript实现了一个接口.
小智 8
就目前而言,TypeScript接口纯粹是编译时实体,因此无法进行任何类型的运行时验证,更不用说甚至知道编译时存在哪些接口.因此,答案似乎是以下之一:
您可以使用JSON-schema作为运行时表示,因为Github上存在许多验证器.一个TypeScript接口 - > JSON Schema转换器是我希望有人在某些时候做出的,但据我所知,目前还不存在.
正如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; }; 
}
MoverShaker结合Mover并Shaker进入新的复合界面.要在运行时验证给定类型是否满足接口MoverShaker,您可以使用以下Javascript代码:
var obj: any = getSomeObject();
if (obj && obj.move && obj.shake && obj.getStatus) {
    var moverShaker = <MoverShaker> obj;
    ...
}
要在Typescript中进行编译时检查,您需要为应用程序的两个部分之间交换的类型定义接口.目前,您必须手动编写动态检查代码(如上所述).因此,如果您忘记同步更新它们,静态类型和动态检查代码可能会在某些时候偏离.正如Brian指出的那样,拥有一个自动生成代码的工具会很不错.
| 归档时间: | 
 | 
| 查看次数: | 7370 次 | 
| 最近记录: |