类型别名 'Permission' 循环引用自身

Type alias 'Permission' circularly references itself

我正在为我的权限对象定义一个类型,它是:

const Permissions = {
    PageManagement: {
        MainPageManagement: {
            ViewPage: 'view-page',
            CreatePage: 'create-page',
            UpdatePage: 'update-page',
            DeletePage: 'delete-page',
            ActivateDeactivatePage: 'activate-deactivate-page',
        },
        PageSectionManagement: {
            ViewPageSection: 'view-page-section',
            CreatePageSection: 'create-page-section',
            UpdatePageSection: 'update-page-section',
            DeletePageSection: 'delete-page-section',
            ActivateDeactivatePageSection: 'activate-deactivate-page-section',
        },
    },
    RoleManagement: {
        ViewRole: 'view-role',
        CreateRole: 'create-role',
        UpdateRole: 'update-role',
        DeleteRole: 'delete-role',
        AssignRole: 'assign-role',
        RemoveRole: 'remove-role',
        ActivateDeactivateRole: 'activate-deactivate-role',
    },
};

如您所见,PageManagement嵌套了两个对象,而RoleManagement则没有。 我正在尝试创建一个 n-level 嵌套类型定义,我现在创建的是:

type Permission = Record<string, string | Permission>

但它给出了这个错误:

Type alias 'Permission' circularly references itself

知道我做错了什么吗?我正在使用 TypeScript v4.2.3

您可以使用接口而不是类型。

const permissions: Permission = {
    PageManagement: {
        MainPageManagement: {
            ViewPage: 'view-page',
            CreatePage: 'create-page',
            UpdatePage: 'update-page',
            DeletePage: 'delete-page',
            ActivateDeactivatePage: 'activate-deactivate-page',
        },
        PageSectionManagement: {
            ViewPageSection: 'view-page-section',
            CreatePageSection: 'create-page-section',
            UpdatePageSection: 'update-page-section',
            DeletePageSection: 'delete-page-section',
            ActivateDeactivatePageSection: 'activate-deactivate-page-section',
        },
    },
    RoleManagement: {
        ViewRole: 'view-role',
        CreateRole: 'create-role',
        UpdateRole: 'update-role',
        DeleteRole: 'delete-role',
        AssignRole: 'assign-role',
        RemoveRole: 'remove-role',
        ActivateDeactivateRole: 'activate-deactivate-role',
    },
};

interface Permission {
  [key: string]: string | Permission
}

还有reproduction example

Record 是问题的根源。它需要一个完整的类型才能产生一个类型。

type Permission = { [key: string]: string | Permission }

这会起作用。