简体   繁体   English

在 Typescript 的 for 循环中使用泛型

[英]Using generics in a for loop in Typescript

This is a followup to this question: Maintain object value types for each key when reassigning values This creates an error:这是这个问题的后续: 在重新分配值时维护每个键的对象值类型这会产生一个错误:

const obj = {
    a: 1,
    b: 'foo',
};

for (const k of (Object.keys(obj) as (keyof typeof obj)[])) {
    obj[k] = obj[k];
}

To fix it, I could use generics and forEach :为了修复它,我可以使用泛型和forEach

(Object.keys(obj) as (keyof typeof obj)[])
    .forEach(<T extends keyof typeof obj>(k: T) => {
        obj[k] = obj[k];
    });

Is there a way to use generics with a for loop?有没有办法在 for 循环中使用泛型? I'm not using forEach anywhere else in my codebase and I'd like to keep it consistent.我没有在我的代码库中的其他任何地方使用forEach ,我希望保持一致。 Also, I don't want to define a separate (non-anonymous) function, since forEach would be cleaner.另外,我不想定义单独的(非匿名)函数,因为forEach会更干净。

TS Playground: https://www.typescriptlang.org/play?#code/MYewdgzgLgBCBGArGBeGBvAUDHMCGAXDAIwA02u8RA5AGYgjXkC+A3JpvQE4wAUokWAGs4tPgHkkAU2BQAdEKkBPCLwSIAlPgh9FSkGKhKADlINwkGgNoBdDVqy4LiK0Jupnrm+2YdekxBl5PVV1LTwdXj1zI1NzMNsNChw5bgBRPGAAC14AHgAVGCkADygpMAATHWjDEzMxdQA+KKJ8rRRGjGSnTzcPdS92J2YNViA TS游乐场: https://www.typescriptlang.org/play?#code/MYewdgzgLgBCBGArGBeGBvAUDHMCGAXDAIwA02u8RA5AGYgjXkC+A3JpvQE4wAUokWAGs4tPgHkkAU2BQAdEKkBPCLwSIAlPgh9FSkGKhKADlINwkGgNoBdDVqy4LiK0Jupnrm+2YdekxBl5PVV1LTwdXj1zI1NzMNsNChw5bgBRPGAAC14AHgAVGCkADygpMAATHWjDEzMxdQA+KKJ8rRRGjGSnTzcPdS92J2YNViA

That is not possible.这是不可能的。 TypeScript is not smart enough to detect that accessing it and assigning it is allowed in this case.在这种情况下,TypeScript 不够聪明,无法检测到允许访问和分配它。 The only thing you can do is to add a @ts-ignore comment above that line:您唯一可以做的就是在该行上方添加@ts-ignore注释:

const obj = {
    a: 1,
    b: 'foo',
};

for (const k of (Object.keys(obj) as (keyof typeof obj)[])) {
    // @ts-ignore
    obj[k] = obj[k];
}

https://www.typescriptlang.org/play?#code/MYewdgzgLgBCBGArGBeGBvAUDHMCGAXDAIwA02u8RA5AGYgjXkC+A3JpvQE4wAUokWAGs4tPgHkkAU2BQAdEKkBPCLwSIAlPgh9FSkGKhKADlINwkGgNoBdDVqy4YAemcwAAlAgBaAJYBzMBAuKQocdSshG1QLREibdmZMIA https://www.typescriptlang.org/play?#code/MYewdgzgLgBCBGArGBeGBvAUDHMCGAXDAIwA02u8RA5AGYgjXkC+A3JpvQE4wAUokWAGs4tPgHkkAU2BQAdEKkBPCLwSIAlPgh9FSkGKhKADBAlBYgSkGKhKADBYBYgSkAccDAlMBAybqAccAdlbagsqAccAdlbagsqAygjBYgS

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM