一尘不染

检查对象是否在运行时使用TypeScript实现接口

javascript

我在运行时加载JSON配置文件,并使用接口定义其预期结构:

interface EngineConfig {
    pathplanner?: PathPlannerConfig;
    debug?: DebugConfig;
    ...
}

interface PathPlannerConfig {
    nbMaxIter?: number;
    nbIterPerChunk?: number;
    heuristic?: string;
}

interface DebugConfig {
    logLevel?: number;
}

...

由于可以使用自动填充等功能,因此可以方便地访问各种属性。

问题: 有没有一种方法可以使用此声明来检查我加载的文件的正确性? 即我没有意外的属性?


阅读 500

收藏
2020-05-01

共2个答案

一尘不染

没有。

当前,类型仅在开发和编译期间使用。类型信息不会以任何方式转换为已编译的JavaScript代码。

2020-05-01
一尘不染

有一种“方法”,但是您必须自己实现。它被称为“用户定义类型防护”,它看起来像这样:

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
}
2020-05-11