Typescript(ts2322)函数返回接口

63lcw9qa  于 2023-02-17  发布在  TypeScript
关注(0)|答案(1)|浏览(134)
export interface AWSTags {
  CreatedBy: string;
  Environment: EnvironmentMap;
  Name: string;
  OwnedBy: string;
  Platform: string;
  Product: string;
  Runbook: string;
  Service: string;
}

其他一些文件使用此方法返回与接口匹配的对象。

export const getAWSTags = (stackName: string, environment: EnvironmentMap, createdBy: string): AWSTags => ({
  CreatedBy: createdBy,
  Environment: environment,
  Name: stackName,
  OwnedBy: "owner",
  Platform: "platform",
  Product: "product",
  Runbook: "url",
  Service: `${stackName}-service`,
});

对于上下文,EnvironmentMap是返回三个字符串之一的类型。
当我试图将返回值赋给AWS标记时,它期望以下类型,它返回2322。
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
解决这个问题有哪些不同的方法或替代方案?

    • EDIT**:这似乎删除了错误,但不确定有效性如何。
export interface AWSTags {
  [key: string]: string;
  CreatedBy: string;
  Environment: EnvironmentMap;
  Name: string;
  OwnedBy: string;
  Platform: string;
  Product: string;
  Runbook: string;
  Service: string;
}

谢谢

46scxncf

46scxncf1#

问题在于,尽管最后的JS是相同的,但从概念上讲,您将对象示例传递给了期待PoJo的对象。
基本上,就是这样:

export interface AWSTags {
  CreatedBy: string;
  Environment: EnvironmentMap;
  Name: string;
  OwnedBy: string;
  Platform: string;
  Product: string;
  Runbook: string;
  Service: string;
}

在TS中声明您有一个示例与此声明匹配,但这并不意味着您的对象将 * 仅 * 由这些值组成。
为了解决这个问题,你需要从使用接口改为仅仅使用类型:

export type AWSTags = {
  CreatedBy: string;
  Environment: EnvironmentMap;
  Name: string;
  OwnedBy: string;
  Platform: string;
  Product: string;
  Runbook: string;
  Service: string;
}

或者,如果希望保留接口,可以在将结果对象注入tags之前对其进行解构:

const stack = new Stack(app, stackName, {
  // ...
  tags: {...getAWSTags(stackName, environment, 'creator')},
});

相关问题