TypeScript更新对象就位

时间:2017-04-21 06:47:18

标签: typescript

如何在Typescript中正确地写这个?

var obj = {
  kv: {
    foo: 'bar',
    bar: 'baz'
  }
};

for(const k in obj.kv) {
  const v = obj.kv[k];
  obj.kv[k] = 'prefix' + v; 
  // error TS7017: Index signature of object type implicitly has an 'any' type.
}

// desired output:
// { kv: { foo: 'prefixbar', bar: 'prefixbaz' } }

我想更新obj.kv对象上的每个项目。

3 个答案:

答案 0 :(得分:2)

你可以这样重构:

var obj = {
  kv: {
    foo: 'bar',
    bar: 'baz'
  }
};

for (const k of Object.keys(obj.kv))
{
  const v = (obj.kv as any)[k];
  (obj.kv as any)[k] = 'prefix' + v;
}

答案 1 :(得分:2)

const obj = {
  kv: {
    foo: 'bar',
    bar: 'baz'
  }
};

Object.entries(obj.kv).forEach(([key, value]) => {
  obj.kv[key] = `prefix${value}`; 
});

请注意,ECMAScript 2016中添加了entries方法。如果您没有本地或通过polyfill可用,则可以编写

Object.entries(obj.kv)
  .map(key => [key, obj.kv[key]])
  .forEach(([key, value]) => {
    obj.kv[key] = `prefix${value}`; 
  });

代替。

答案 2 :(得分:1)

虽然有点冗长,但这种类型更友好:

var obj = {
  kv: {
    foo: 'bar',
    bar: 'baz'
  } as {
      [key:string]: string,
  }
};

for (const k of Object.keys(obj.kv)) {
  const v = obj.kv[k];

  // error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
  // const erroneous = Math.round(v);  

  obj.kv[k] = 'prefix' + v; 
}