TypeScript联合类型缺少属性
我有三种类型:TypeScript联合类型缺少属性,typescript,union-types,Typescript,Union Types,我有三种类型: export type FooInitialStateType = { Id: string; Name: string; Email: string; Password: string }; export type BarInitialStateType = { Id: string; Balance: number; }; export type BazInitialStateType = { Id: string; Limit: numb
export type FooInitialStateType = {
Id: string;
Name: string;
Email: string;
Password: string
};
export type BarInitialStateType = {
Id: string;
Balance: number;
};
export type BazInitialStateType = {
Id: string;
Limit: number;
};
然后我创建了一个联合类型,如下所示:
export type FooBarBazType = FooInitialStateType | BarInitialStateType | BazInitialStateType
然后,我有一个通用方法处理包含上述所有3种类型的数组:
getFooBarBaz (
events: FooBarBazType[]
): {
foobarbaz0: FooBarBazType;
} {
const foobarbaz0 = <FooBarBazType>events[0];
return {
foobarbaz0
};
}
我得到一个TS错误:
类型“FooBarBazType”不可分配给类型“FooInitialStateType”
因为FooInitialStateType
不包含来自BarInitialStateType
和BazInitialStateType
的属性
实际问题:
您可能希望
getFooBarBaz()
成为一个输出类型取决于输入类型的函数:
function getFooBarBaz<T extends FooBarBazType>(events: T[]): { foobarbaz0: T; } {
const foobarbaz0 = events[0];
return {
foobarbaz0
};
}
这有用吗?祝你好运
您可以使用类型断言来覆盖编译器,但是…您不能(本质上)在这里安全地向下转换。根据编译器的说法不是这样的。我不确定你真正需要的是工会类型——这不是更像是一个普通人的工作吗?@VLAZ如果你能详细说明,那就太好了!好的,似乎您期望一个包含一种类型元素的数组,并且该元素将是
Foo
或Bar
或Baz
,结果将是相同类型的数组。您在这里描述的输入意味着您可以接受Foo
/Bar
/Baz
项的任何组合,结果将是其中之一,但无法保证是哪一个。因此,根据编译器的说法,向方法提供一个Foo
项数组并生成Baz
,是完全有效的。或者任何组合。您似乎试图在同一超类型的其他子类型的数组中找到一个子类型的实例,在这种情况下(就类型和实际功能而言),您可能应该阅读此处的代码,而不是如中所述的。例如,fooEvents
不会在任何地方声明。理想情况下,可以将代码放入一个独立的IDE中,就像这样,它将演示您所面临的问题,并且只演示该问题。
function getFooBarBaz<T extends FooBarBazType>(events: T[]): { foobarbaz0: T; } {
const foobarbaz0 = events[0];
return {
foobarbaz0
};
}
const fooEvents = [
{
Id: "foo",
Name: "Foobert",
Email: "foobert@example.com",
Password: "Emb4rr4ss|ngP455w%?d"
}
];
const {
foobarbaz0
}: {
foobarbaz0: FooInitialStateType;
} = getFooBarBaz(fooEvents); // no error now