打字稿错误:属性“...”缺失型“...”
问题描述:
我正在为打字稿误差这段代码:打字稿错误:属性“...”缺失型“...”
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个属性。
有没有更好的方法?
在此先感谢!
答
尝试铸造所需的类型
let event: KeyboardEvent = {
preventDefault:() => { },
stopPropagation:() => { },
keyCode: 75
} as KeyboardEvent;
你试过双铸造? ('evt:KeyboardEvent =({...} as any)作为KeyboardEvent') – olivarra1
@ olivarra1即使只是一个简单的单投就能胜任。 '让事件:的KeyboardEvent = { \t的preventDefault:()=> {}, \t stopPropagation:()=> {}, \t键代码:75 }作为的KeyboardEvent;'。不知道TypeScript是否允许这样做。很棒的发现。 –
如果你只需要3个属性,你可以定义你自己的接口只有这3个属性,并在你的代码中使用它。不要使用真正的'KeyboardEvent',只要确保真实的事件可以分配给你的。 – artem