Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用扩展更新对现有对象的引用?_Javascript_Typescript - Fatal编程技术网

Javascript 使用扩展更新对现有对象的引用?

Javascript 使用扩展更新对现有对象的引用?,javascript,typescript,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()

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

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

由于,对象排列无法使用此通用功能。虽然这将起作用:

function refreshStore(k: keyof State) {
    Store[k] = {...Store[k]};
}
Object spread是
Object.assign({},…)
的语法糖。它可以用于:

function refreshStore<K extends keyof State>(k: K) {
    Store[k] = Object.assign({}, Store[k]);
}
函数刷新存储(k:k){
Store[k]=Object.assign({},Store[k]);
}

这似乎是一个缺陷/限制。您可以将参数
k
作为
any
-->
传递,也可以作为`Store[k]={……Store[k.toString()]}`@NiritLevi有问题。。。。查看新的非对象到达时发生的情况。。我觉得奇怪的是,它会允许这样做。我认为泛型版本错误是正确的。因此:-是的,这就是为什么这些限制仍然存在和争论的原因。我想这个问题可以通过
函数refreshStore(k:keyof State)
得到妥善处理。哪种情况?有号码的那个?显然,您无法执行{…4}如果您有
s4:number
,则会导致错误,否则将按预期工作。
function refreshStore<K extends keyof State>(k: K) {
    Store[k] = Object.assign({}, Store[k]);
}