首页 > 解决方案 > 如何在 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);

有什么方法可以即时键入对象吗?

标签: typescript

解决方案


首先,我认为mock函数的重载应该重新排序,但这与我们的问题没有直接关系。我做了一个公关

为了使其工作,您应该编写自己的aws-sdk-mock模块自定义声明。

  1. typings.d.ts在根文件夹中创建文件。
  2. 将此代码粘贴到typings.d.ts
declare module 'aws-sdk-mock' {
    function mock<T>(service: "SQS", method: "receiveMessage", replace: T): void;
}

添加 generic 很重要T,因为它比any内置声明更具体。

  1. 然后你应该明确地使用泛型参数:

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.


推荐阅读