代码之家  ›  专栏  ›  技术社区  ›  Ruben

具有变量键的嵌套TypeScript对象

  •  1
  • Ruben  · 技术社区  · 6 年前

    我有一个JavaScript方法,可以根据目录结构自动导入JSON模式。这意味着我的文件位于 /path/to/my/file.json ,然后加载到 schemas.path.to.my.file

    我使用以下TypeScript定义在TypeScript中使用我的代码,但没有用。它总是给我关于 no index signature ,尽管如此,似乎有一个。

    import jsonschema = require("jsonschema");
    
    interface NestedSchemas {
        [key: string]: NestedSchemas | jsonschema.Schema;
    }
    
    interface MySchemas {
        validator: jsonschema.Validator;
        initialized: boolean;
        walk: Promise<NestedSchemas>;
        schemas: NestedSchemas;
    }
    
    declare var _: MySchemas;
    export = _;
    

    当我尝试使用我的代码时,我看到linter弹出以下内容:

    enter image description here

    有趣的是它首先显示的事实 Schema 然后 NestedSchemas (虽然在接口中以另一种方式定义),但它不会尝试解析它,因为它是一个字符串键。

    我做错了什么?

    1 回复  |  直到 6 年前
        1
  •  4
  •   ben    6 年前

    您可以这样简化问题: 这会发出警告:

    interface NestedSchemas {
        [key: string]: NestedSchemas | string;
    }
    const themas: NestedSchemas = {};
    themas['0.1'].foo.bar.baz
    

    但这不会:

    interface NestedSchemas {
        [key: string]: NestedSchemas;
    }
    const themas: NestedSchemas = {};
    themas['0.1'].foo.bar.baz
    

    这是因为typescript不知道 themas['0.1'] 将为类型 NestedSchemas string

    • 您可以通过铸造:

    (((themas['0.1'] as NestedSchemas).foo as NestedSchemas).bar as NestedSchemas).baz

    (我承认,不是很优雅)

    • 也可以使用用户定义的类型Guards

    你应该阅读 https://www.typescriptlang.org/docs/handbook/advanced-types.html 了解详细信息。