【发布时间】:2021-08-27 09:41:05
【问题描述】:
AWSMock.mock("SQS", "receiveMessage", {
Messages: [
{
MessageId: "abcd",
Body: "sample body",
},
],
});
在上面的示例中,如何将对象键入为ReceiveMessageResult 实例?
我无法键入 AWSMock.mock() 方法,因为这是第 3 方模拟库中的通用方法。
????️ 这不起作用,因为它不会捕获任何类型错误(例如,任何缺少的字段都不会触发错误):
AWSMock.mock("SQS", "receiveMessage", {
Messages: [
{
MessageId: "abcd",
Body: "sample body",
},
],
} as ReceiveMessageResult);
????️这可以工作,但我不想通过额外的变量:
const response: ReceiveMessageResult = {
Messages: [
{
MessageId: "abcd",
Body: "sample body",
},
],
};
AWSMock.mock("SQS", "receiveMessage", response);
有什么方法可以即时键入对象吗?
【问题讨论】:
-
我很遗憾地认为您的第三种解决方案是做到这一点的唯一方法。
-
你用的是哪个ts版本?我尝试了一个与对您不起作用的代码类似的代码,并且它具有自动完成功能。您也可以尝试旧断言:
..."receiveMessage", <ReceiveMessageResult>{ Messages: [... -
@EcksDy 是的,确实我确实得到了自动补全,但类型没有经过验证。我的意思是,如果我不尊重接口,那么 TypeScript 就不会显示任何错误。
-
@MatthieuNapoli 那么断言不是这项工作的工具。断言是告诉 TS 忽略它所知道的关于目标的任何事情,并接受你的断言作为事实。根据该定义,它不能向您显示任何错误,因为您使用断言语句覆盖了任何可能的错误。它甚至不会寻找类型和实际对象之间的差异。您的最后一个示例有效,因为它不是断言。您正在创建一个变量
response,它只能接收适合ReceiveMessageResult的对象。如果你这样做const response: ReceiveMessageResult = 3;那将是一个错误。 -
@MatthieuNapoli 执行
const response: ReceiveMessageResult = 3 as ReceiveMessageResult;不会引发编译错误,因为您将覆盖 ts 对 3(数字)的了解并将其标记为as ReceiveMessageResult。您会收到“ts(2352)”错误,告诉您先转换为未知数,然后再转换为 ReceiveMessageResult,但它仍会编译。
标签: typescript