【问题标题】:Maintain object value types for each key when reassigning values重新分配值时维护每个键的对象值类型
【发布时间】:2021-06-16 02:50:51
【问题描述】:
const obj = {
    a: 1,
    b: 'foo',
};

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

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

我明白了:

Type 'string | number' is not assignable to type 'never'.
  Type 'string' is not assignable to type 'never'.

obj 每个键都有不同的值类型,我想维护每个键的值类型。换句话说,我希望obj.a 保持numberobj.b 保持string。我假设发生此错误是因为 TS 预计 obj[k] 的类型为 string | number

有没有办法让 TS 为每个键保持正确的值类型?

【问题讨论】:

  • 虽然不是严格的重复(据我所知),但请参阅 thisthis 以获得解释和解决方案。还要记住,为了从集合中提取类型,该类型必须静态可知,并且obj 在运行时可以具有多种类型的属性。
  • 为什么不使用Object.assign。像这样:Object.assign(obj, {a:20});Object.assign(obj, {a:20, b:"another foo"});

标签: javascript typescript


【解决方案1】:

这是一种方法,使用泛型将键作为 type K 而不是运行时值 k

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

function set<K extends keyof typeof obj>(k : K) {
    obj[k] = obj[k];
}

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

Playground link

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 2019-08-27
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多