使用spread来更新对现有对象的引用?

时间:2018-04-08 16:42:04

标签: javascript typescript

我有一个对象,其键在接口中定义。该对象包含对象:

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"] };

Online Demo

1 个答案:

答案 0 :(得分:1)

由于current limitations,对象传播不能使用此通用函数。虽然这会奏效:

select * from ORDERsy 
where amount < any(select amount from ORDERsy where odate = '06-oct-1999');

对象传播是function refreshStore(k: keyof State) { Store[k] = {...Store[k]}; } 的语法糖。它可以代替使用:

Object.assign({}, ...)