typescript - 如何在 TypeScript 中键入独立对象?
问题描述
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);
有什么方法可以即时键入对象吗?
解决方案
首先,我认为mock
函数的重载应该重新排序,但这与我们的问题没有直接关系。我做了一个公关
为了使其工作,您应该编写自己的aws-sdk-mock
模块自定义声明。
typings.d.ts
在根文件夹中创建文件。- 将此代码粘贴到
typings.d.ts
declare module 'aws-sdk-mock' {
function mock<T>(service: "SQS", method: "receiveMessage", replace: T): void;
}
添加 generic 很重要T
,因为它比any
内置声明更具体。
- 然后你应该明确地使用泛型参数:
import AWSMock from 'aws-sdk-mock';
type Message = {
MessageId: string;
Body: string;
}
type ReceiveMessageResult = {
Messages: Message[],
}
AWSMock.mock<ReceiveMessageResult>("SQS", "receiveMessage", {
Messages: [
{
MessageId: "abcd",
Body: "sample body",
x: 1 // expected error
},
],
});
瞧,它有效。
我试图让它在没有显式泛型参数的情况下工作,但是因为any
内置类型中有第三个参数的类型,所以不可能在any
.
推荐阅读
- windows - 如何从命令行转储/恢复硬盘分区表(Bash)
- pyspark - Spark Streaming 调度最佳实践
- python - Python 字母数字和字符比较
- node.js - Firebase 在 Nodejs 中处理事务
- c++ - 重载带有编译错误的运算符
- javascript - 带有承诺的 Node.js mongodb
- ruby-on-rails - Rails 5.0.2 与 bundler 2.0.1 不兼容
- javascript - 为什么我班上的“口渴”方法不起作用?
- r - 连续x变量的ggplot直方图误差,
- android - EditText.text 返回的究竟是什么?