在 Typescript 的 for 循环中使用泛型

时间:2021-06-17 04:15:43

标签: javascript typescript

这是这个问题的后续:Maintain object value types for each key when reassigning values 这会产生一个错误:

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

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

要修复它,我可以使用泛型和 forEach

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

有没有办法在 for 循环中使用泛型?我没有在我的代码库中的其他任何地方使用 forEach,我希望保持一致。另外,我不想定义单独的(非匿名)函数,因为 forEach 会更简洁。

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

1 个答案:

答案 0 :(得分:0)

那是不可能的。在这种情况下,TypeScript 不够聪明,无法检测到允许访问和分配它。您唯一可以做的就是在该行上方添加 @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