我已经用很多种方法进行了搜索,但是我无法找到有关条件类型的更多信息,我正在尝试创建一种称为 的类型ChatItemMessage
,它有 2 个索引,type
并且value
。
这是当前的代码:
type ChatItemMessage = {
type: ChatItemMessageType;
value: ChatMessage | ChatDate;
};
enum ChatItemMessageType {
Date = "date",
Message = "message",
}
type ChatMessage = {
id: number;
};
type ChatDate = {
date: string;
};
我想要做的是value
根据 的值有条件地设置 的类型type
:
export type ChatItemMessage = {
type: ChatItemMessageType;
value: (ChatItemMessage['type'] extends ChatItemMessageType.Message ? ChatMessage : ChatDate);
};
这不起作用,我也尝试过(和其他变体):
export type ChatItemMessage<T extends ChatItemMessageType> = {
type: T;
value: (T extends ChatItemMessageType.Message ? ChatMessage : ChatDate);
};
在我的代码中我正在执行以下操作:
declare const data: ChatItemMessage[]
data.map(
message => message.type === ChatItemMessageType.Date ?
message.value.date : // error!
// ~~~~ <-- Property 'date' does not exist on type 'ChatMessage'.
message.value.id.toFixed() // error!
// ~~ <-- Property 'id' does not exist on type 'ChatDate'.
);
我想要的是message.value
,ChatMessage
因为我已经检查过了message.type === ChatItemMessageType.Message
,但是 IDE 总是说 是ChatDate
。
这个想法是让 IDE 和任何开发人员都知道,如果type = ChatItemMessageType.Message
那么value = ChatMessage
,否则(在这种情况下)就会是ChatDate
,所以如果开发人员在运行时想到了错误的类型,就会出现新的错误。
我甚至不确定这是否能实现。如果您需要更多信息,请告诉我!