TypeScript更新对象就位
如何在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
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