【发布时间】:2021-10-24 21:49:15
【问题描述】:
我正在尝试模块化我的类型转换。这是我的代码:
export enum detailsDataTypes {
MACHINE = 'MACHINE',
USER = 'USER',
ABSTRACT = 'ABSTRACT',
}
export type sharedTypes = {
name?: string;
OEECategory?: string;
OAECategory?: string;
color?: string;
type?: detailsDataTypes;
};
export type AbstractData = sharedTypes & {
layer: string;
};
export type UserData = sharedTypes & {
timeout: number;
stateAfterTimeout: string;
accessCanChoose: string;
accessCanOverride: string;
};
export type MachineData = sharedTypes & {
stateCategory: string;
timeout: number;
stateAfterTimeout: string;
accessCanChoose: string;
accessCanOverride: string;
canOverrideOnlyByStates: boolean;
};
type DetailsData = AbstractData | UserData | MachineData;
export const detailsDataCaster = (data: DetailsData): DetailsData | null => {
switch (data.type) {
case detailsDataTypes.ABSTRACT:
return <AbstractData>data;
case detailsDataTypes.MACHINE:
return <MachineData>data;
case detailsDataTypes.USER:
return <UserData>data;
default:
console.log('Wrong data type. Go yell at backend team or check your mocks');
return null;
}
};
我想要实现的是告诉 TS 我要返回 AbstractData 或 UserData 或 MachineData 或 null。但是现在,它不喜欢我这样做:
export const Details: FC<IDetails> = ({ data: $data = mockUserData }): ReactElement => {
const data = detailsDataCaster($data);
switch (data.type) {
case detailsDataTypes.ABSTRACT:
return <>Abstract</>;
case detailsDataTypes.MACHINE:
return <>Machine</>;
case detailsDataTypes.USER:
return <UserDisplay data={data} />; // error is here
default:
return <div />;
}
};
错误
Type 'DetailsData' is not assignable to type 'UserData'.
Type 'AbstractData' is not assignable to type 'UserData'.
Type 'AbstractData' is missing the following properties from type '{ timeout: number; stateAfterTimeout: string; accessCanChoose: string; accessCanOverride: string; }': timeout, stateAfterTimeout, accessCanChoose, accessCanOverride
据我了解,| 在 TS 中并不意味着 OR。我知道有 AND &,但这没有任何意义。我以为如果我施放,我会返回什么就很清楚了,但我发现它不是那么简单。我错过了什么?
【问题讨论】:
-
请考虑修改这个问题中的代码以构成一个minimal reproducible example,当它放入像The TypeScript Playground (link, this is an IDE with your code in it)这样的独立IDE时,清楚地表明您面临的问题没有不相关的错误(如未导入/未声明的类型或值)。这将使那些想要帮助您的人立即着手解决问题,而无需首先重新创建它。它将使您得到的任何答案都可以针对定义明确的用例进行测试。
-
detailsDataCaster中的类型断言与为data推断的类型没有区别。我认为您正在尝试创建一个discriminated union,因此可以通过检查data.type来缩小范围,但这不是您所拥有的。
标签: javascript reactjs typescript types