带有混合对象的Typescript数组

带有混合对象的Typescript数组,typescript,Typescript,我有3条路线接收不同的参数 接口页面格式{ 第1页:字符串; 第2页:字符串; 路线图:T; } 接口ARouteFormat{aValue:string;} 常数A:React.FC=()=>A; 接口BRouteFormat{bValue:string;} 常数B:React.FC=()=>B; 接口CRouteFormat{cValue:string;} 常数C:React.FC=()=>C; 另外,我有一个包含路由的数组 接口路由格式{ 组件:React.FC 参数?:{ [key

我有3条路线接收不同的参数


接口页面格式{
第1页:字符串;
第2页:字符串;
路线图:T;
}
接口ARouteFormat{aValue:string;}
常数A:React.FC=()=>A;
接口BRouteFormat{bValue:string;}
常数B:React.FC=()=>B;
接口CRouteFormat{cValue:string;}
常数C:React.FC=()=>C;
另外,我有一个包含路由的数组

接口路由格式{
组件:React.FC
参数?:{
[key in keyof Parameters]:字符串;
}
}
类型RouteParameters=RouteFormat | RouteFormat | RouteFormat;
常数a:路由参数[]=[
{
组成部分:A,
参数:{aValue:'示例a'},
},
{
构成部分:B,
参数:{bValue:'示例a'},
},
{
构成部分:C,
参数:{cValue:'示例a'},
},
];
这是可行的,但是
参数
并不总是与
组件
匹配,也就是说,我可以在数组中创建和元素。但我需要把它们做成同样的类型

{
组成部分:A,
参数:{aValue:'example a',bValue:'asdasd'},
},

您只需替换
路由格式
界面中的
参数
值,使其与通用
参数
匹配即可

interface RouteFormat<Parameters> {
    component: React.FC<PageFormat<Parameters>>
    params: Parameters
}

Unrelated:不要给类型变量命名
Parameters
,因为现在的问题是
b值:'asdasd'
部分可分配给
RouteParameters
,因为
充当一个联合,并接受一点一点和另一点的类型。如果您将每个对象分配给一个独立类型的变量,该变量将执行您想要的操作。另一种方法是编写一个包含大量exclude的大型tybe,这些exclude确定每个元素的正确类型,但这比键入每个对象更痛苦。

const a: RouteParameters[] = [
    {
        component: C,
        params: { cValue: 'example a' }, // ok
    },
    {
        component: C,
        params: { aValue: "a", cValue: "c" } // ok - no error on excess properties
    },
    {
        component: C // error - missing params
    },
    {
        component: C,
        params: {} // error - missing cValue
    },
    {
        component: C,
        params: { aValue: "a" } // error - missing cValue
    }
];