如何在TypeScript中键入独立对象


AWSMock.mock("SQS", "receiveMessage", {
Messages: [
{
MessageId: "abcd",
Body: "sample body",
},
],
});

在上面的示例中,如何将对象键入为ReceiveMessageResult实例

我不能键入AWSMock.mock()方法,因为这是第三方模拟库中的通用方法。

️这不起作用,因为它不会捕获任何类型的错误(例如,任何丢失的字段都不会触发错误):

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);

有什么方法可以在飞行中键入一个对象吗?

我能想到几个选项:

  1. 在目标项目中使用更好的类型创建PR。但我看到,2019年已经有了公关,而且没有合并
  2. 不要使用维护不善的第三方图书馆
  3. 覆盖打字。看看这个答案。但你必须自己维护它
  4. 使用您建议的变量(这可能是imho最直接的选项)
  5. 创建包装函数:
function t<T>(input: T): T {
return input;
}
interface Book {
id: number;
title: string;
}
function log(input: any): any {
console.log(input);
}
log({title: 'Galaxy Guide'} as Book); // Does not complain
log(t<Book>({title: 'Galaxy Guide'})); // Complains that id is missing
  1. 创建一个重载函数并在任何地方使用它:
function myAwsMock<T>(service: string, method: string, replace: T): void {
AWSMock.mock(service, method, replace);
}

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

为了使其工作,您应该编写自己的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;
}

添加泛型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之后不可能使用更具体的类型。

这是不可能的

我的问题是在TypeScript中执行此操作,而没有解决办法(我已经有了)。所有其他问题都提供了新的、不同的解决方案。

我相信这些其他答案仍然有用(请随意阅读),但我想对那些和我面临同样问题的人给出一个明确的答案:没有本地解决方案。没有变通办法是做不到的。

最新更新