在 Typescript 中声明和初始化字典

新手上路,请多包涵

给定以下代码

interface IPerson {
   firstName: string;
   lastName: string;
}

var persons: { [id: string]: IPerson; } = {
   "p1": { firstName: "F1", lastName: "L1" },
   "p2": { firstName: "F2" }
};

为什么初始化不被拒绝?毕竟,第二个对象没有“lastName”属性。

原文由 mgs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

编辑:这已在最新的 TS 版本中得到修复。引用@Simon_Weaver 对 OP 帖子的评论:

注意:这已被修复(不确定哪个确切的 TS 版本)。正如您所料,我在 VS 中遇到了这些错误: Index signatures are incompatible. Type '{ firstName: string; }' is not assignable to type 'IPerson'. Property 'lastName' is missing in type '{ firstName: string; }'.


显然,在声明时传递初始数据时这不起作用。我猜这是 TypeScript 中的一个错误,所以你应该在项目站点提出一个错误。

您可以通过在声明和初始化中拆分示例来使用类型化字典,例如:

 var persons: { [id: string] : IPerson; } = {};
persons["p1"] = { firstName: "F1", lastName: "L1" };
persons["p2"] = { firstName: "F2" }; // will result in an error

原文由 thomaux 发布,翻译遵循 CC BY-SA 3.0 许可协议

Typescript 在您的情况下失败,因为它希望所有字段都存在。使用 Record 和 Partial 实用程序类型来解决它。

Record<string, Partial<IPerson>>

 interface IPerson {
   firstName: string;
   lastName: string;
}

var persons: Record<string, Partial<IPerson>> = {
   "p1": { firstName: "F1", lastName: "L1" },
   "p2": { firstName: "F2" }
};

解释。

  1. 记录 类型创建一个字典/哈希图。
  2. 部分 类型表示可能缺少某些字段。

备用。

如果您希望姓氏可选,您可以附加一个 ? Typescript 会知道它是可选的。

 lastName?: string;

https://www.typescriptlang.org/docs/handbook/utility-types.html

原文由 aWebDeveloper 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进