具有可变键的嵌套 TypeScript 对象

Rub*_*ten 1 typescript typescript-typings

我有一个 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 = _;
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

有趣的是它首先显示Schema然后NestedSchemas(虽然在界面中以相反的方式定义),并且它无论如何都不会尝试解析它,因为它是一个字符串键。

我在这里做错了什么?

ben*_*ben 5

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

interface NestedSchemas {
    [key: string]: NestedSchemas | string;
}
const themas: NestedSchemas = {};
themas['0.1'].foo.bar.baz
Run Code Online (Sandbox Code Playgroud)

虽然这不会:

interface NestedSchemas {
    [key: string]: NestedSchemas;
}
const themas: NestedSchemas = {};
themas['0.1'].foo.bar.baz
Run Code Online (Sandbox Code Playgroud)

这是因为打字稿不知道 willthemas['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了解有关它的详细信息。