【问题标题】:Initializing an object with a pattern in a concise way以简洁的方式使用模式初始化对象
【发布时间】:2019-07-23 22:15:33
【问题描述】:

我对 Typescript(和 Javascript)比较陌生,并且一直在搞乱类。我试图找到一种简洁的方法来创建一个对象,该对象将填充类似的条目,同时保持类型安全。

这是我写的代码:

let testFixture: Fixture = (() => {
  let stringPrefix = 'TEST BaseEventDTO';
  let result = {}; // The object to become a "Fixture".

  ['id', 'name', 'location'].forEach(element => {
    result[`${element}`] = generateId(`${stringPrefix} ${element}`);
  });

  return result;
})();

在此代码中,Fixtures 具有必需的字符串字段idnamelocation。此外,我希望它们都在字段名称之前有 stringPrefix,如 foreach 中所示。我正在尝试创建一个对象,而无需多次键入相同的内容,例如前缀或字段名称。但是,结果是来自 VSCode 的警告 Type {} is missing the following properties of Type 'Fixture': 'id', 'name', and 'location'

有没有一种传统的方式(或只是工作方式)来解决这个问题?

另外,澄清一下,我正在使用匿名函数编写此代码,以使 stringPrefix 变量成为本地变量。

编辑:将 return result; 更改为 return <Fixture>result; 修复了错误。但是如果我的解决方案是一个陷阱,或者如果有另一种更好的方法来做到这一点,我会留下这个。

为了进一步说明,最后的结果应该是这样的:

let result = {
    id: generateID(`${stringPrefix} id`),
    name: generateID(`${stringPrefix} name`),
    location: generateID(`${stringPrefix} location`)
}

然后将其转换为“Fixture”类型。

【问题讨论】:

  • 请添加结果的外观。 generateId 在做什么?
  • 我已经用更多信息编辑了我的问题。够了吗?
  • generateID 采用给定的字符串并输出一个为数据库目的而编码的唯一字符串。
  • 您对此感到困惑,而不仅仅是澄清:为了澄清,我正在使用匿名函数编写此代码,以使 stringPrefix 变量成为本地变量。您使用了箭头在 IFEE 中运行,这是完全没有必要的。您还使用字符串文字语法使代码过于复杂,这是不必要的。使用 var 名称和简单的串联。
  • @RandyCasburn 我不确定你的意思。据我所知,箭头功能是 IFEE。箭头函数周围只有括号。至于字面语法,我认为是意见。这对我来说比串联更具可读性。

标签: javascript typescript javascript-objects


【解决方案1】:

我认为你总是必须投射,你有两个选择

转换初始变量

const keys: Array<keyof Fixture> = ['id', 'name', 'location'];

let testFixture: Fixture = (() => {
  let stringPrefix = 'TEST BaseEventDTO';
  let result = {} as Fixture

  keys.forEach(element => {
    result[element] = generateId(`${stringPrefix} ${element}`);
  });

  return result;
})();

转换返回语句

const keys: Array<keyof Fixture> = ['id', 'name', 'location'];

let testFixture: Fixture = (() => {
  let stringPrefix = 'TEST BaseEventDTO';
  let result: Partial<Fixture> = {}

  keys.forEach(element => {
    result[element] = generateId(`${stringPrefix} ${element}`);
  });

  return result as Fixture;
})();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-18
    • 2015-04-08
    • 1970-01-01
    • 2020-01-04
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多