数组中的联合类型 - TypeScript 不显示错误

Union Types in Array - TypeScript don't show errors

我正在使用 TypeScript 2.8.1 在 Angular 5 中处理菜单。

我想将类型添加到验证传入配置中,但是当我添加不正确的属性(例如 uncorrectData)时,没有任何反应。

为什么 TS 不显示错误?

示例代码:

type MenuElement = MenuGroup | MenuItem;

interface MenuGroup {
    id: number;
    name: string;
    icon?: string;
    items: MenuItem[];
}

interface MenuItem {
    id: number;
    name: string;
    url: string;
}

const menuData = [
    {
        id: 1,
        name: 'category',
        icon: 'star',
        items: [
            {
                id: 1,
                name: 'subcategoryOne',
                url: 'urlOne'
            },
            {
                id: 2,
                name: 'subcategoryTwo',
                url: 'urlTwo'
            }
        ]
    },
    {
        id: 2,
        name: 'categoryTwo',
        url: 'urlThree',
        undesirableData: 'text' // undesirable data 
    }
];

export class MainComponent {
    public appMenu: Array<MenuElement>;

    constructor() {
        this.appMenu = this.createMenu(menuData);
    }

    createMenu(menu: Array<MenuElement>) {
        return menu;
    }
}

要验证您正在创建的对象字面量,您需要在 const 上实际指定类型,否则将根据用法推断出 const 类型。

const menuData: MenuElement[] = [ ... ];

通过调用 this.createMenu(menuData) 时不会出现错误,因为 menuDataMenuElement[] 兼容,即使它确实有一些额外的字段,对象字面量也会针对额外的内容进行验证仅在创建时的属性。例如:

let o  = {
    id: 2,
    name: 'categoryTwo',
    url: 'urlThree',
    undesirableData: 'text'
}
let m :MenuItem = o;  //valid structurally compatible

let m2: MenuItem  = { // invalid literal is checked for extra properties
    id: 2,
    name: 'categoryTwo',
    url: 'urlThree',
    undesirableData: 'text' 
}

如果您指定具有不兼容类型的已知属性,则如果存在类型不兼容,您将收到错误,但如果您将对象文字分配给明确键入的 variable/parameter/field,您只会收到额外属性的错误MenuItem