检查对象是否在运行时使用类型记录实现接口

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

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

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

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

interface DebugConfig {
    logLevel?: number;
}

...

这使得访问各种属性变得很方便,因为我可以使用自动完成等。

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

提问于
用户回答回答于

可以在运行时使用我几年前发布的类型记录编译器的增强版本来完成此检查。可以执行以下操作:

export interface Person {
    name: string;
    surname: string;
    age: number;
}

let personOk = { name: "John", surname: "Doe", age: 36 };
let personNotOk = { name: 22, age: "x" };

// YES. Now you CAN use an interface as a type reference object.
console.log("isValid(personOk):  " + isValid(personOk, Person) + "\n");
console.log("isValid(personNotOk):  " + isValid(personNotOk, Person) + "\n");

这是输出:

isValid(personOk):  true

Field name should be string but it is number
isValid(personNotOk):  false

请注意,isValid功能递归工作,所以也可以使用它来验证嵌套对象。

用户回答回答于

习惯于区分可能被使用枚举的类型记录编译器混淆的类型,以防止转换程序接受使用一种类型而不是另一种类型,如下所示:

[MyTypes.yaml]

definitions: 
    type-A: 
        type: object
        properties:
            type:
                enum:
                - A
            foo: 
                type: array
                item: string
                maxLength: 2
    type-B: 
        type: object
        properties:
            type:
                enum:
                - B
            foo: 
                type: array
                item: string
                minLength: 3
        items: number

生成一个.d.ts文件如下:

[MyTypes.d.ts]

interface typeA{
    type: "A";
    foo: string[];
}

interface typeB{
    type: "B";
    foo: string[];
}

扫码关注云+社区