打字稿错误:属性“...”缺失型“...”

打字稿错误:属性“...”缺失型“...”

问题描述:

我正在为打字稿误差这段代码:打字稿错误:属性“...”缺失型“...”

let event: KeyboardEvent = { 
    preventDefault:() => { }, 
    stopPropagation:() => { }, 
    keyCode: 75 
}; 

错误所在:

Type '{ preventDefault:() => void; stopPropagation:() => void; keyCode: number; }' is not assignable to type 'KeyboardEvent'. Property 'altKey' is missing in type '{ preventDefault:() => void; stopPropagation:() => void; keyCode: number; }'.

我明白了,它是TypeScript,它希望我提供完整的KeyboardEvent。但KeyboardEvent的全部定义是:

interface KeyboardEvent extends UIEvent { 
    readonly altKey: boolean; 
    readonly char: string | null; 
    readonly charCode: number; 
    readonly ctrlKey: boolean; 
    readonly key: string; 
    readonly keyCode: number; 
    readonly locale: string; 
    readonly location: number; 
    readonly metaKey: boolean; 
    readonly repeat: boolean; 
    readonly shiftKey: boolean; 
    readonly which: number; 
    readonly code: string; 
    getModifierState(keyArg: string): boolean; 
    initKeyboardEvent(typeArg: string, canBubbleArg: boolean, cancelableArg: boolean, viewArg: Window, keyArg: string, locationArg: number, modifiersListArg: string, repeat: boolean, locale: string): void; 
    readonly DOM_KEY_LOCATION_JOYSTICK: number; 
    readonly DOM_KEY_LOCATION_LEFT: number; 
    readonly DOM_KEY_LOCATION_MOBILE: number; 
    readonly DOM_KEY_LOCATION_NUMPAD: number; 
    readonly DOM_KEY_LOCATION_RIGHT: number; 
    readonly DOM_KEY_LOCATION_STANDARD: number; 
} 

这是很多。我为单元测试创​​建这个事件,我只需要这三个属性。处理这个问题的正确方法是什么?我试图避免简单地声明它为any,我也不想定义21个属性。

有没有更好的方法?

在此先感谢!

+2

你试过双铸造? ('evt:KeyboardEvent =({...} as any)作为KeyboardEvent') – olivarra1

+2

@ olivarra1即使只是一个简单的单投就能胜任。 '让事件:的KeyboardEvent = { \t的preventDefault:()=> {}, \t stopPropagation:()=> {}, \t键代码:75 }作为的KeyboardEvent;'。不知道TypeScript是否允许这样做。很棒的发现。 –

+0

如果你只需要3个属性,你可以定义你自己的接口只有这3个属性,并在你的代码中使用它。不要使用真正的'KeyboardEvent',只要确保真实的事件可以分配给你的。 – artem

尝试铸造所需的类型

let event: KeyboardEvent = { 
    preventDefault:() => { }, 
    stopPropagation:() => { }, 
    keyCode: 75 
} as KeyboardEvent;