3

下面的代码是用 typescript 编写的,它使用“react-dom/test-utils”中的 ReactTestUtils。

let nameInput = TestUtilsExtended.findRenderedDOMComponentWithTag(root, "input");

TestUtilsExtended.Simulate.change(nameInput, {
    target: {
        value : "alice"
    }
} as any);

它工作正常,当我放置该as any铸件时,结果与预期一致。如果我删除铸件,则会发生此错误:

[ts] 类型参数 '{ target: { value: string; }; }' 不可分配给“SyntheticEventData”类型的参数。属性“目标”的类型不兼容。输入'{值:字符串;}' 不可分配给类型 'EventTarget'。对象字面量只能指定已知属性,而“值”不存在于“EventTarget”类型中。

这是Simulate.change我从中得到的智能感知@types/react-dom (version: ^15.5.4)

const Simulate.change: (element: React.ReactInstance, eventData?: SyntheticEventData) => void

SyntheticEventData接口的声明中,我发现target属性的类型是JavascriptEventTarget

export interface OptionalEventProperties {
    // ....
    target?: EventTarget;
}

export interface SyntheticEventData extends OptionalEventProperties {
    // ....
}

由于代码在我进行as any强制转换时按预期工作,所以我不太明白这个EventTarget界面是如何工作的。

各位大佬知道去除掉色块的方法as any吗?因为如果可能的话,我想尽量减少any代码中的任何内容。我想让代码强类型。

4

1 回答 1

0

您需要将其转换为未知,然后将其转换为 EventTarget

let nameInput = TestUtilsExtended.findRenderedDOMComponentWithTag(root, "input");

TestUtilsExtended.Simulate.change(nameInput, {
    target: {
        value : "alice"
    }
} as unknown as EventTarget);
于 2020-07-06T02:49:32.937 回答