使用跨页更新对现有对象的引用



我有一个对象,它的键是在接口中定义的。对象包含对象:

class S1  { n: number; }
class S2  { n: number; }
class S3  { n: number; }
interface State {
    s1: S1;
    s2: S2;
    s3: S3;
}
var Store: State =
    {
        s1: new S1(),
        s2: new S2(),
        s3: new S3(),
    }

我正在修改一个对象并将其再次保存在存储中:

var s1 = new S1(); //for example
s1.n = 4;
Store.s1 = s1;

但现在我想更新s1引用。

我知道我可以通过以下方式做到这一点:

Store["s1"] = { ...Store["s1"] };

但是我想通过一种方法来做到这一点,它只接受商店的密钥:

function refreshStore<K extends keyof State>(k: K) {
    Store[k] = {
        ...Store[k] //<---error
    };
}

但是我在这里得到一个错误^:

跨页类型只能从对象类型创建

问题:

如何使refreshStore方法喜欢预期的refreshStore('s1')

基本上我想让这个refreshStore('s1')

  Store["s1"] = { ...Store["s1"] };

在线演示

由于当前的限制,对象传播不适用于此泛型函数。虽然这将起作用:

function refreshStore(k: keyof State) {
    Store[k] = {...Store[k]};
}

对象传播是Object.assign({}, ...)的句法糖。它可以代替使用:

function refreshStore<K extends keyof State>(k: K) {
    Store[k] = Object.assign({}, Store[k]);
}

相关内容

最新更新