Comment écrire correctement cela dans 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' } }

Je souhaite mettre à jour chaque élément de l'objet obj.kv.

0
Kokizzu 21 avril 2017 à 09:47

3 réponses

Meilleure réponse

Bien qu'un peu verbeux, ce serait plus convivial:

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; 
}
1
ntabee 21 avril 2017 à 07:42
const obj = {
  kv: {
    foo: 'bar',
    bar: 'baz'
  }
};

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

Notez que la méthode entries a été ajoutée dans ECMAScript 2016. Si vous ne l'avez pas disponible, nativement ou via un polyfill, vous pouvez écrire

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

Au lieu.

2
Aluan Haddad 22 avril 2017 à 04:14

Vous pouvez le refactoriser de cette façon:

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;
}
2
Kokizzu 21 avril 2017 à 07:05