Typescript 当逻辑上应该知道类型时,为什么必须使用类型断言?

Typescript 当逻辑上应该知道类型时,为什么必须使用类型断言?,typescript,typescript-typings,Typescript,Typescript Typings,我遇到了一个场景(如下所示),在这个场景中,逻辑上可以确定对象的类型,但无论如何我都必须使用类型断言,甚至似乎必须创建“预类型化”伪变量才能正确访问特定于类型的属性。我想知道有没有更有效的方法 export type EventTypeItem = event1 | event2; enum Event { Event1, Event2 } interface event1 { readonly id: string; } interface eve

我遇到了一个场景(如下所示),在这个场景中,逻辑上可以确定对象的类型,但无论如何我都必须使用类型断言,甚至似乎必须创建“预类型化”伪变量才能正确访问特定于类型的属性。我想知道有没有更有效的方法

export type EventTypeItem =
    event1 |
    event2;

enum Event {
    Event1,
    Event2
}

interface event1 {
    readonly id: string;
}

interface event2 {
    readonly caller: ICaller;
}

interface ICaller {
    readonly id: string;
}


export interface IEvent {
    readonly eventItem: EventTypeItem;
    readonly eventType: Event;
}

// IEvent event gets passed to component

let exampleUnknownEvent: IEvent; // to access id - we'd either follow '.id' or '.caller.id'
// but we don't know before hand what Event this will be

// within some function

const x = exampleUnknownEvent as event1; // this seems like an unnecessary assignment just to type assert
const y = exampleUnknownEvent as event2; // this seems like an unnecessary assignment just to type assert

if (exampleUnknownEvent.eventType === Event.Event2) {
    return x.caller.id;
} // I'd rather return exampleUnknownEvent.caller.id as we've established type in 'if'
  //   e.g. exampleUnkownEvent.caller.id as event2

你要做的是打字保护,它应该会起作用。这是一个更简单的版本,没有额外的变量:

导出类型EventTypeItem=event1 | event2;
枚举事件{
事件1,
事件2
}
接口事件1{
只读id:字符串;
只读事件:event.Event1
}
接口事件2{
只读调用者:iCaler;
只读事件:event.Event2
}
接口振荡器{
只读id:字符串;
}
导出接口事件{
只读事件项:事件类型项;
}
例如Unknownevent:IEvent=/*在此处获取您的事件*/
if(例如Unknownevent.eventItem.event==事件.Event1){
log(例如unknownevent.eventItem.id);
}否则{
log(例如unknownevent.eventItem.caller.id);
}

您使用的是什么版本的TypeScript?

您好,我使用的是3.4.1。看着你的版本(谢谢你的话),我意识到我的代码不准确-对不起。我已经更新了我的示例,以提供泛型IEvent对象上的事件类型,该对象由if语句检查。由于事件类型现在不直接在特定的事件类型上,我猜类型推断丢失了。