具有可变键

时间:2018-03-12 14:25:19

标签: typescript typescript-typings

我有一个JavaScript方法,可以根据目录结构自动导入JSON Schema。这意味着我有一个位于/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 = _;

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

enter image description here

感兴趣的是,它首先显示Schema然后NestedSchemas(虽然在界面中定义了另一种方式),并且它没有尝试解决它无论如何,因为它是一个字符串键。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您可以像这样简化问题: 这给出了警告:

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

这是因为打字稿不知道themas['0.1']NestedSchemas还是string类型。

  • 你可以通过施放来绕过它:

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

(我承认,不是很优雅)

  • 或者您可以使用用户定义的类型警卫

有关详细信息,请阅读https://www.typescriptlang.org/docs/handbook/advanced-types.html