简体   繁体   English

为什么打字稿不能识别我的类型扩展?

[英]Why isn't typescript recognizing my type extensions?

Typescript should be able to tell which extension of a type you are dealing with based on its properties using switch case. Typescript 应该能够使用 switch case 根据其属性来判断您正在处理的类型的哪个扩展。

Here are my types:这是我的类型:

export enum MessageType {
    CallEnd = "CallEnd",
    L2Measurement = "L2Measurement",
}

export type TraceMessages = {
    messageType: MessageType;
};

export interface TraceMessageL2Measurement extends TraceMessages {
    messageType: MessageType.L2Measurement;
    l2Measurement: L2MeasurementMessage;
}

export interface TraceMessageCallEnd extends TraceMessages {
    messageType: MessageType.CallEnd;
    callEnd: CallEndMessage;
}

export type TraceMessage =
    | TraceMessages
    | TraceMessageCallEnd
    | TraceMessageL2Measurement;

Now, with a switch case structure like:现在,使用如下 switch case 结构:

switch (l2message.messageType) {
    case MessageType.L2Measurement:
        // Typescript should now know that l2message: TraceMessageL2Measurement

But Typescript does not understand this, and only offers the base type's (TraceMessages') properties.但 Typescript 不理解这一点,只提供基本类型的 (TraceMessages') 属性。 What am I doing wrong?我究竟做错了什么?

Thanks!谢谢!

You just have to exclude TraceMessages from definition of TraceMessage :您只需从TraceMessage TraceMessages

export type TraceMessage =
  | TraceMessageCallEnd
  | TraceMessageL2Measurement;

Otherwise TypeScript can't get rid of the possibility of l2message being a TraceMessage with messageType: "L2Measurement" , which do not have the l2Measurement property.否则 TypeScript 无法摆脱l2message是带有messageType: "L2Measurement"TraceMessage的可能性,它没有l2Measurement属性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM