Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript更新对象就位_Typescript - Fatal编程技术网

TypeScript更新对象就位

TypeScript更新对象就位,typescript,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

如何在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
对象上的每个项目。

您可以通过以下方式对其进行重构:

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

您可以通过以下方式重构它:

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

虽然有点冗长,但这会更便于类型:

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

虽然有点冗长,但这会更便于类型:

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; 
}
请注意,
条目
方法是在ECMAScript 2016中添加的。如果本机或通过polyfill无法使用,则可以编写

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

请注意,
条目
方法是在ECMAScript 2016中添加的。如果本机或通过polyfill无法使用,则可以编写

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

相反。

对不起,我看到的是另一个答案,投了赞成票!(仍然认为我的答案更好:p)对不起,我在看另一个答案,投了赞成票!(仍然认为我的更好:p)这更漂亮,但ObjectConstructorIt中不存在TS2339条目。这是一种相当新的语言添加。它可能不在您的浏览器中。对不起that@Kokizzu我用一个解释和一个例子修改了我的答案,这个例子不依赖于
Object.entries
,但保留了流畅的特征和解构。再次感谢您的评论。这更漂亮,但ObjectConstructorIt中不存在TS2339条目。这是一个最近添加的语言。它可能不在您的浏览器中。对不起that@Kokizzu我用一个解释和一个例子修改了我的答案,这个例子不依赖于
Object.entries
,但保留了流畅的特征和解构。再次感谢您的评论。您可以为(Object.keys(obj.kv).map(k=>k as keyof typeof obj.kv)){const v=obj.kv[k];}编写
,而不是将
作为{[key:string]:string}
。这样,您就不会丢失对
obj.kv
的后续属性访问的强类型,而不是
作为{[key:string]:string}
,您可以为(const k of Object.keys(obj.kv).map(k=>k as keyof typeof obj.kv)){const v=obj.kv[k];}
。这样,您就不会丢失对
obj.kv