我在运行时加载JSON配置文件,并使用接口定义其预期结构:
interface EngineConfig { pathplanner?: PathPlannerConfig; debug?: DebugConfig; ... } interface PathPlannerConfig { nbMaxIter?: number; nbIterPerChunk?: number; heuristic?: string; } interface DebugConfig { logLevel?: number; } ...
由于可以使用自动填充等功能,因此可以方便地访问各种属性。
问题: 有没有一种方法可以使用此声明来检查我加载的文件的正确性? 即我没有意外的属性?
没有。
当前,类型仅在开发和编译期间使用。类型信息不会以任何方式转换为已编译的JavaScript代码。
有一种“方法”,但是您必须自己实现。它被称为“用户定义类型防护”,它看起来像这样:
interface Test { prop: number; } function isTest(arg: any): arg is Test { return arg && arg.prop && typeof(arg.prop) == 'number'; }
当然,该isTest函数的实际实现完全取决于您,但是好的一面是它是一个实际函数,这意味着它是可测试的。
现在,在运行时,您将用于isTest()验证对象是否遵守接口。在编译时,打字稿会紧随其后,并按预期对待后续使用,即:
let a:any = { prop: 5 }; a.x; //ok because here a is of type any if (isTest(a)) { a.x; //error because here a is of type Test }