简洁地使用模式初始化对象

时间:2019-03-01 20:49:47

标签: javascript typescript javascript-objects

我对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;
})();

在此代码中,灯具具有必需的字符串字段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`)
}

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

1 个答案:

答案 0 :(得分:2)

我认为您将始终需要强制转换,并且有两个选择

投放初始变量

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